#include <cstdio>
#include <vector>
#include <algorithm>
#define N 16010
using namespace std;
int sol=-1001,sum[N],p[N];
int i,n,a[N],x,y;
vector<int> v[N];
bool viz[N];
void dfs(int nod)
{
if(viz[nod])
return;
viz[nod]=1;
sum[nod]=a[nod];
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
if(!viz[*it])
dfs(*it);
if(sum[*it]>0)
sum[nod]+=sum[*it];
}
}
int main()
{
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
if(p[y]) swap(x,y);
v[x].push_back(y);
p[y]=x;
// v[y].push_back(x);
}
for(i=1;i<=n;i++)
{
dfs(i);
sol=max(sol,sum[i]);
}
printf("%d\n",sol);
return 0;
}