#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N = 1e5 + 5;
vector<int>son[N];
int n;
int val[N];
int dp[N][2];
void dfs(int x) {
int m = son[x][0];
int maxn = dp[m][0];
for (int i = 0; i < son[x].size(); i++) {
int y = son[x][i];
dfs(y);
dp[x][1] += max(dp[y][0], dp[y][1]);
if (maxn < max(dp[y][0], dp[y][1])) {
maxn = max(dp[y][0], dp[y][1]);
}
}
dp[x][1] += val[x];
dp[x][0] += maxn;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> val[i];
}
int x, y;
for (int i = 1; i < n; i++) {
cin >> x >> y;
if (x > y) swap(x, y);
son[x].push_back(y);
}
dfs(1);
int ans = max(dp[1][0], dp[1][1]);
cout << ans << endl;
return 0;
}