#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX= 16000;
ifstream in( "asmax.in" );
ofstream out( "asmax.out" );
vector <int> v[NMAX+1];
bool a[NMAX+1];
int val[NMAX+1], d[NMAX+1], N, x, y, ans= -99999;
void DFS_cresc( int nod )
{
a[nod]= 1;
d[nod]= val[nod];
for ( int i= 0; i<(int)v[nod].size(); ++i )
{
if ( a[ v[nod][i] ]==0 )
{
DFS_cresc(v[nod][i]);
if ( d[v[nod][i]]>0 )
{
d[nod]+= d[ v[nod][i] ];
}
}
}
}
int main( )
{
in >> N;
for ( int i= 1; i<=N; ++i )
{
in >> val[i];
}
for ( int i= 1; i<N; ++i )
{
in >> x >> y;
v[x].push_back( y );
v[y].push_back( x );
}
DFS_cresc(1);
for ( int i= 1; i<=N; ++i )
{
if ( d[i]>ans )
{
ans= d[i];
}
}
out << ans << '\n';
return 0;
}