#include<stdio.h>
#include<vector>
#define INT long long int
std::vector<INT> jasick[100001];
INT n,node[100001],i,j,a,b,maxsum[100001],ans,vis[100001];
INT f(int k)
{
    vis[k]=1;
    int fmax=0,smax=0,cur,i;
    for(i=0;i<jasick[k].size();i++)
    {
        if(vis[jasick[k][i]]==0)
        {
            cur=f(jasick[k][i]);
            if(cur>smax)
            {
                if(cur>fmax)
                {
                    smax=fmax;
                    fmax=cur;
                }
                else
                {
                    smax=cur;
                }
            }
        }
    }
    maxsum[k]=fmax+smax+node[k];
    return (fmax+node[k])<0?0:(fmax+node[k]);
}
int main()
{
    freopen(".25.in","r",stdin);
    freopen(".25.out","w",stdout);
    scanf("%lld",&n);
    for(i=1;i<=n;i++)scanf("%lld",node+i);
    for(i=0;i<n-1;i++)
    {
        scanf("%lld%lld",&a,&b);
        jasick[a].push_back(b);
        jasick[b].push_back(a);
    }
    f(1);
    for(i=1;i<=n;i++)ans=ans>maxsum[i]?ans:maxsum[i];
    if(ans==0)
    {
        ans=-0x7fffffff;
        for(i=1;i<=n;i++)ans=ans>node[i]?ans:node[i];
    }
    printf("%lld",ans);
}
