#include <cstdio>
int max(int x, int y) {return x > y ? x : y;}
int r[6001], fa[6001], so[6001][6001], size[6001], l, k, f[6001][2], root = 1;
void dfs(int now)
{
int i;
for (i = 1; i <= size[now]; i++)
dfs(so[now][i]);
f[now][1] = r[now];
for (i = 1; i <= size[now]; i++)
{
f[now][1] += f[so[now][i]][0];
f[now][0] += max(f[so[now][i]][0], f[so[now][i]][1]);
}
}
int main()
{
int n, i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &r[i]);
for (i = 1; i < n; i++)
{
scanf("%d %d", &l, &k);
fa[l] = k;
so[k][++size[k]] = l;
}
while (fa[root]) root = fa[root];
dfs(root);
printf("%d", max(f[root][1], f[root][0]));
return 0;
}