#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <climits>
using namespace std;
using VI = vector<int>;
using VB = vector<bool>;
using VVI = vector<VI>;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
const int MAX_N = 5005;
int n;
VI val, dp, t;
VVI adj;
void ReadInput();
void Solve();
void DFS(int node);
int main()
{
ReadInput();
Solve();
return 0;
}
void Solve()
{
DFS(1);
int ans(-INT_MAX);
for (int i = 1; i <= n; ++i)
ans = max(ans, dp[i]);
fout << ans;
}
void DFS(int node)
{
for (int nbr : adj[node])
if (t[node] != nbr)
{
t[nbr] = node;
DFS(nbr);
if (dp[nbr] > 0)
dp[node] += dp[nbr];
}
}
void ReadInput()
{
fin >> n;
t = dp = VI(n + 1);
adj = VVI(n + 1);
for (int i = 1; i <= n; ++i)
fin >> dp[i];
int u, v;
for (int i = 1; i < n; ++i)
{
fin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
}