#include <fstream>
#include <vector>
#define NMAX 16002
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin ("asmax.in"); ofstream fout ("asmax.out");
int n, cost[NMAX], sum[NMAX], smax = -INF;
vector <int> arb[NMAX];
bool used[NMAX];
void ReadData ()
{
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> cost[i];
for (int i = 1, a, b; i <= n - 1; ++i)
{
fin >> a >> b;
arb[a].push_back (b);
arb[b].push_back (a);
}
}
void DFS (int k)
{
used[k] = true;
sum[k] = cost[k];
for (int i = 0; i < arb[k].size (); ++i)
{
if (!used[arb[k][i]])
{
DFS (arb[k][i]);
if (sum[arb[k][i]] > 0)
{
sum[k] += sum[arb[k][i]];
}
}
}
if (sum[k] > smax)
smax = sum[k];
}
void WriteData ()
{
DFS (1);
fout << smax << "\n";
}
int main ()
{
ReadData ();
WriteData ();
}