#include <fstream>
#include <vector>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
const int Nmax = 16005;
int val[Nmax], n, rasp = -1005, dp[Nmax];
vector<int> vecini[Nmax];
bool viz[Nmax];
void bfs( int nod )
{
//fout << "nod = " << nod <<endl;
if ( viz[nod] == 1 )
return ;
viz[nod] = 1;
int i;
dp[nod] = val[nod];
for ( i = 0; i < vecini[nod].size(); ++i )
{
int vecin = vecini[nod][i];
bfs(vecin);
if ( dp[vecin] > 0 )
dp[nod] += dp[vecin];
}
rasp = max(rasp, dp[nod]);
}
int main()
{
int i;
fin >> n;
for ( i = 1; i <= n; ++i )
{
fin >> val[i];
}
for ( i = 1; i < n; ++i )
{
int a, b;
fin >> a >> b;
vecini[a].push_back(b);
vecini[b].push_back(a);
}
bfs(1);
fout << rasp;
return 0;
}