#include <bits/stdc++.h>
using namespace std;
const int MAXN = 16e3 , VMAX = 1e3; // ghicesc, fiindca nu zice limita nicaieri
int v[MAXN + 1] , maxs[MAXN + 1];
vector < int > vec[MAXN + 1];
bitset < MAXN + 1 > vzn;
void dfs ( int nod ) {
int i , vnod;
vzn[nod] = 1;
maxs[nod] = v[nod];
for ( i = 0 ; i < vec[nod].size () ; i++ ) {
vnod = vec[nod][i];
if ( vzn[vnod] == 0 ) {
dfs ( vnod );
maxs[nod] = maxs[nod] + max ( 0 , maxs[vnod] );
}
}
}
int main () {
ifstream cin ( "asmax.in" );
ofstream cout ( "asmax.out" );
int n , i , maxt , a , b;
cin >> n;
for ( i = 1 ; i <= n ; i++ )
cin >> v[i];
for ( i = 1 ; i < n ; i++ ) {
cin >> a >> b;
vec[a].push_back ( b );
vec[b].push_back ( a );
}
dfs ( 1 );
maxt = -VMAX;
for ( i = 1 ; i <= n ; i++ )
maxt = max ( maxt , maxs[i] );
cout << maxt << '\n';
return 0;
}