#include <bits/stdc++.h>
using namespace std;
ifstream in("asmax.in");
ofstream out("asmax.out");
const int NMAX = 16005;
vector<int> vec[NMAX];
int cost[NMAX], ans = 0;
bool viz[NMAX];
int dfs (int x) {
int ret = cost[x];
viz[x] = true;
vector<int> paths;
for (auto y : vec[x]) {
if (!viz[y]) {
int rety = dfs(y);
if (rety > 0) {
ret += rety;
}
}
}
ans = max(ans, ret);
return ret;
}
int main () {
int n;
in >> n;
for (int i = 1; i <= n; ++i) {
in >> cost[i];
}
for (int i = 1; i < n; ++i) {
int a, b;
in >> a >> b;
vec[a].push_back(b);
vec[b].push_back(a);
}
for (int i = 1; i <= n; ++i) {
ans += cost[i];
}
dfs(1);
out << ans;
return 0;
}