#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <vector>
#define inf 100005
using namespace std;
int w[inf];//记录各点权重
vector<int> G[inf];
int d[2][inf];
//d[1][i] 为取第i个节点的最大值
//d[0][i] 为不取
bool vis[inf];
int n;//节点个数
void dfs(int u) {
vis[u] = 1;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];//u的第i个儿子
if (vis[v])continue;
dfs(v);
d[1][u] += d[0][v];
d[0][u] += max(d[0][v], d[1][v]);
}
d[1][u] += w[u];
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &w[i]);
int a, b;
for (int i = 0; i < n - 1; i++) {
scanf("%d %d", &a, &b);
G[a].push_back(b);
G[b].push_back(a);
}
dfs(1);
cout << max(d[0][1], d[1][1]);
return 0;
}