#include <bits/stdc++.h>
const int infmin = -1e9;
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
vector<vector<int>> g;
vector<int> cost;
int n;
vector<int> dp;
void dfs(int nod, int parent)
{
dp[nod] = cost[nod];
for(auto v : g[nod])
{
if(v == parent) continue;
dfs(v, nod);
dp[nod] += max(0, dp[v]);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
fin >> n;
cost.resize(n + 1);
g.resize(n + 1);
dp.resize(n + 1);
for(int i = 1; i <= n; i++)
fin >> cost[i];
for(int i = 1; i <= n - 1; i++)
{
int u,v;
fin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, -1);
int ans = infmin;
for(int i = 1; i <= n; i++)
ans = max(ans, dp[i]);
fout << ans;
return 0;
}