#include <cstdio>
#include <vector>
using namespace std;
int max_v(int a, int b){ return a > b ? a : b; }
//vector<int> cost; // 1,000,000
vector<vector<int>> adj;
//vector<bool> vi;
int cost[1000001], ans = 0;
bool vi[1000001];
int dfs(int vn, int p_max){
vi[vn] = 1;
int ret = cost[vn], subsum=p_max, p = max_v(cost[vn], p_max), c;
for(int& v : adj[vn])
if(!vi[v]){
c = dfs(v, p);
ret = max_v(ret, c);
subsum += c;
}
ans = max_v(ans, subsum);
return ret;
}
int main() {
int N,u,v,i;
scanf("%d",&N);
adj.resize(N+1);
//cost.resize(N),
//vi = vector<bool>(N, false);
for(i=0;i<N;i++) scanf("%d",&cost[i]);
for(i=0;i<N-1;i++){
scanf("%d%d",&u,&v);
u--,v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(0,0);
printf("%d",ans);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IG1heF92KGludCBhLCBpbnQgYil7IHJldHVybiBhID4gYiA/IGEgOiBiOyB9Ci8vdmVjdG9yPGludD4gY29zdDsgLy8gMSwwMDAsMDAwCnZlY3Rvcjx2ZWN0b3I8aW50Pj4gYWRqOwovL3ZlY3Rvcjxib29sPiB2aTsKCmludCBjb3N0WzEwMDAwMDFdLCBhbnMgPSAwOwpib29sIHZpWzEwMDAwMDFdOwppbnQgZGZzKGludCB2biwgaW50IHBfbWF4KXsKCXZpW3ZuXSA9IDE7CglpbnQgcmV0ID0gY29zdFt2bl0sIHN1YnN1bT1wX21heCwgcCA9IG1heF92KGNvc3Rbdm5dLCBwX21heCksIGM7CgkKCWZvcihpbnQmIHYgOiBhZGpbdm5dKQoJCWlmKCF2aVt2XSl7CgkJCWMgPSBkZnModiwgcCk7CgkJCXJldCA9IG1heF92KHJldCwgYyk7CgkJCXN1YnN1bSArPSBjOwoJCX0KCWFucyA9IG1heF92KGFucywgc3Vic3VtKTsKCXJldHVybiByZXQ7Cn0KCmludCBtYWluKCkgewoJaW50IE4sdSx2LGk7CglzY2FuZigiJWQiLCZOKTsKCWFkai5yZXNpemUoTisxKTsKCS8vY29zdC5yZXNpemUoTiksIAoJLy92aSA9IHZlY3Rvcjxib29sPihOLCBmYWxzZSk7Cglmb3IoaT0wO2k8TjtpKyspIHNjYW5mKCIlZCIsJmNvc3RbaV0pOwoJZm9yKGk9MDtpPE4tMTtpKyspewoJCXNjYW5mKCIlZCVkIiwmdSwmdik7CgkJdS0tLHYtLTsKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOwoJCWFkalt2XS5wdXNoX2JhY2sodSk7Cgl9CglkZnMoMCwwKTsKCXByaW50ZigiJWQiLGFucyk7CglyZXR1cm4gMDsKfQ==