#include <bits/stdc++.h>
using namespace std;
int n, m, lim[16001], dp[16001];
set <int> s[16001];
vector <int > v;
ifstream f("asmax.in");
ofstream g("asmax.out");
void citire()
{
f >> n;
int x;
v.push_back(0);
for(int i = 1;i <= n;i ++)
f >> x, v.push_back(x);
for(int i = 1;i <= n - 1;i ++)
{
int y;
f >>x >>y;
s[x].insert(y);
s[y].insert(x);
}
}
void dfs(int nod)
{
lim[nod] = 1;
for(auto i : s[nod])
if(!lim[i])
dfs(i);
}
void dinamic(int nod)
{
for(auto i : s[nod])
dp[nod] += v[i];
dp[nod] += v[nod];
}
void rez()
{
memset(dp, 0, sizeof(dp));
for(int i = n; i >= 1;i --)
{
dinamic(i);
dp[i] = max(dp[i], dp[i - 1]);
}
// for(int i = 1;i <= n;i ++)
// cout << dp[i]<<" ";
g << *max_element(dp + 1, dp + 1 + n);
}
int main()
{
citire();
//dfs(1);
rez();
return 0;
}