#include <bits/stdc++.h>
using namespace std;
int val[6000];
bool mark[6000];
vector<int> grid[6000];
int main() {
int n, m, t;
cin >> n;
for (int i = 0; i < n; ++i) cin >> val[i];
for (int i = 1; i < n; ++i) {
cin >> m >> t;
--m;
--t;
mark[m] = 1;
grid[t].push_back(m);
}
auto dfs = [&](auto& my, int i) ->pair<int, int> {
auto ans = make_pair(0, 0);
auto l = make_pair(0, 0);
auto r = make_pair(0, 0);
if (grid[i].size() > 0) l = my(my, grid[i][0]);
if (grid[i].size() > 1) r = my(my, grid[i][1]);
ans.first = max(l.first, l.second) + max(r.first, r.second);
ans.second = l.first + r.first + val[i];
return ans;
};
for (int i = 0; i < n; ++i) {
if (!mark[i]) {
auto ans = dfs(dfs, i);
std::cout << max(ans.first, ans.second);
break;
}
}
std::cout << flush;
return 0;
}