#include <fstream>
#include <vector>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
int v[100001];
int rez[100001];
void dfs(int node,vector<vector<int>> &tree, vector<int> &parent, vector <int> &leaf,int padre) {
parent[node]=padre;
int cnt=0;
for (int i=0;i<tree[node].size();i++) {
if (tree[node][i]!=padre) {
dfs(tree[node][i],tree,parent,leaf,node);
cnt++;
}
}
if (cnt==0) {
leaf[node]=1;
}
}
void cadane(int node, vector <vector <int>> &tree, vector<int> &parent) {
int sum=v[node];
for (int i=0;i<tree[node].size();i++) {
if (tree[node][i]!=parent[node]) {
cadane(tree[node][i],tree,parent);
if (rez[tree[node][i]]>=0) {
sum+=rez[tree[node][i]];
}
}
}
rez[node]=sum;
}
int main() {
int n;
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
vector<vector<int>> tree(n+1);
vector<int> parent(n+1);
vector<int> leaf(n+1);
for (int i=1;i<=n-1;i++) {
int a,b;
fin >> a >> b;
tree[a].push_back(b);
tree[b].push_back(a);
}
dfs(1,tree,parent,leaf, 0);
cadane(1,tree,parent);
int maxim=-1e9;
for (int i=1;i<=n;i++) {
maxim=max(maxim,rez[i]);
}
fout << maxim;
return 0;
}