#include <bits/stdc++.h>
using namespace std;
const int MAXLEN = 6005;
const int INF = 1 << 30;
int n;
int val[MAXLEN];
int father[MAXLEN];
vector<int> tree[MAXLEN];
int dp[MAXLEN][2];
void dfs(int u) {
dp[u][0] = 0;
dp[u][1] = val[u];
for (int i = 0; i < (int)tree[u].size(); i++) {
int son = tree[u][i];
dfs(son);
dp[u][0] += max(dp[son][1], dp[son][0]);
dp[u][1] += dp[son][0];
}
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> val[i];
tree[i].clear();
father[i] = -1;
}
for (int i = 1; i <= n; i++) {
int l, k;
cin >> l >> k;
tree[k].push_back(l);
father[l] = k;
}
int tmp = 1;
while(father[tmp] != -1){
tmp = father[tmp];
}
dfs(tmp);
cout << max(dp[tmp][1],dp[tmp][0]);
return 0;
}