#include <iostream>
#include <cstring>
using namespace std;
const int N = 6005;
struct edge {
int v, next;
} e[N];
int eid, p[N];
int r[N], f[N][2];
int deg[N];
void insert(int u, int v) {
e[eid].v = v;
e[eid].next = p[u];
p[u] = eid++;
}
int n;
void dfs(int u, int fa) {
f[u][1] = r[u];
f[u][0] = 0;
for (int i = p[u]; i != -1; i = e[i].next) {
int v = e[i].v;
if (v!=fa) {
dfs(v, u);
f[u][1] += f[v][0];
f[u][0] += max(f[v][0], f[v][1]);
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> r[i];
}
memset(p, -1, sizeof(p));
for (int i = 1; i < n; i++) {
int l, k;
cin >> l >> k;
insert(k, l);
insert(l, k);
deg[l]++;
}
int root;
for (int i = 1; i <= n; i++) {
if (deg[i] == 0) {
root = i;
break;
}
}
dfs(root, -1);
cout << max(f[root][0], f[root][1]) << endl;
return 0;
}
求助大佬orz