#include<cstdio>
#include<cstring>
#include<vector>
int val[16100],n,root=0,ans=~0x7fffffff;
bool vis[16100];
std::vector<int> tree[16100];
inline int max(int a,int b){return a>b?a:b;}
int get(int x){
int r=val[x];
vis[x]=1;
for(auto i:tree[x])
if(!vis[i])
r+=max(0,get(i));
vis[x]=0;
return r;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",val+i);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
tree[x].push_back(y);
tree[y].push_back(x);
}
while(++root<=n)
ans=max(ans,get(root));
printf("%d",ans);
}