//Ilie Dumitru
#include<cstdio>
#include<vector>
typedef long long int ll;
const int NMAX=16005;
const ll MOD=1000000007;
FILE* f=fopen("asmax.in", "r"), *g=fopen("asmax.out", "w");
int N, v[NMAX], answer, maxSum[NMAX];
std::vector<int> edges[NMAX];
void dfs(int node, int tt)
{
int s=v[node], son;
std::vector<int>::iterator i0, i1;
for(i0=edges[node].begin(), i1=edges[node].end();i0!=i1;++i0)
if((son=*i0)!=tt)
{
dfs(son, node);
if(maxSum[son]>0)
s+=maxSum[son];
}
maxSum[node]=s;
if(s>answer)
answer=s;
}
int main()
{
int i, a, b;
fscanf(f, "%d", &N);
for(i=0;i<N;++i)
fscanf(f, "%d", v+i);
answer=v[0];
for(i=1;i<N;++i)
{
fscanf(f, "%d%d", &a, &b);
edges[--a].push_back(--b);
edges[b].push_back(a);
}
dfs(0, -1);
fprintf(g, "%d", answer);
fclose(f);
fclose(g);
return 0;
}