#include <stdio.h>
#define NMAX 16001
int val[2*NMAX],next[2*NMAX],last[NMAX],rez[NMAX],ok[NMAX],v[NMAX];
void dfs(int x){
int y,poz;
ok[x]=1;
rez[x]=v[x];
poz=last[x];
while(poz!=0){
y=val[poz];
if(ok[y]==0){
ok[y]=1;
dfs(y);
if(rez[y]>0){
rez[x]+=rez[y];
}
}
poz=next[poz];
}
}
int main(){
int n,i,k,x,y,max;
FILE *fin,*fout;
fin=fopen("asmax.in","r");
fout=fopen("asmax.out","w");
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&v[i]);
}
k=0;
for(i=1;i<n;i++){
fscanf(fin,"%d%d",&x,&y);
k++;
val[k]=x;
next[k]=last[y];
last[y]=k;
k++;
val[k]=y;
next[k]=last[x];
last[x]=k;
}
dfs(1);
max=-2000000000;
for(i=1;i<=n;i++){
if(max<rez[i]){
max=rez[i];
}
}
fprintf(fout,"%d\n",rez[1]);
fclose(fin);
fclose(fout);
return 0;
}