#include <iostream>
using namespace std;
const int maxn = 16000;
int n, beauty[maxn], head[maxn], dp[maxn], visited[maxn], edgenum;
struct node {
int to;
int next;
}edge[maxn * 3];
void add(int u, int v)
{
edge[++edgenum].to = v;
edge[edgenum].next = head[u];
head[u] = edgenum;
edge[++edgenum].to = u;
edge[edgenum].next = head[v];
head[v] = edgenum;
}
void dfs(int root)
{
dp[root] = beauty[root];
visited[root] = 1;
for (int i = head[root]; i; i = edge[i].next)
{
if (visited[edge[i].to]) continue;
dfs(edge[i].to);
if (dp[edge[i].to] > 0)
dp[root] += dp[edge[i].to];
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> beauty[i];
for (int i = 1; i < n; i++)
{
int a, b;
cin >> a >> b;
add(a, b);
}
dfs(1);
int maxs = -0x7fffffff;
for (int i = 1; i <= n; i++)
maxs = maxs > dp[i] ? maxs : dp[i];
cout << maxs;
return 0;
}