#include <bits/stdc++.h>
using namespace std;
const int nmax = 16009;
vector<int>G[nmax];
queue<int>q;
int c[nmax],N,nr[nmax],dp[nmax],best;
bool v[nmax];
inline void BFS(){
int i,nod;
for(i = 1; i <= N; ++i)
if(nr[i] == 1) q.push(i);
best = -nmax;
while(!q.empty()){
nod = q.front();
q.pop();
v[nod] = true;
dp[nod]+= c[nod];
for(auto it: G[nod]){
--nr[it];
if(dp[it] > 0)dp[nod]+=dp[it];
if(!v[it] && nr[it] == 1)q.push(it);
}
best = max(best,dp[nod]);
}
}
int main(){
int i,x,y;
freopen ("asmax.in","r",stdin);
freopen ("asmax.out","w",stdout);
scanf("%d\n",&N);
for(i = 1; i <= N; ++i)
scanf("%d ",&c[i]);
for(i = 1; i < N; ++i){
scanf("%d %d\n",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
++nr[x];++nr[y];
}
BFS();
printf("%d\n",best);
return 0;
}