```c
#include <bits/stdc++.h>
using namespace std;
int dp[6005][2], w[6005], a[6005][6005], f[6005], root;
int n;
void dfs(int r)
{
if (dp[r][1] > 0)
return;
dp[r][1] = w[r];
for (int i = 1; i <= n; i++)
{
if (a[r][i])
{
dfs(i);
dp[r][0] += max(dp[i][1], dp[i][0]);
dp[r][1] += dp[i][0];
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> w[i];
int x, y;
for (int i = 1; i <= n - 1; i++)
{
cin >> x >> y;
a[y][x] = 1;
f[x] = y;
}
root = y;
while (f[root] != 0)
{
root = f[root];
}
dfs(root);
cout << max(dp[root][0], dp[root][1]);
return 0;
}