//****** @mdazmat9 **********
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define UB upper_bound
#define LB lower_bound
#define BS binary_search
#define EB emplace_back
#define PB push_back
#define endl "\n"
#define MOD 1000000007
#define MOD2 998244353
#define F first
#define S second
#define ALL(a) (a).begin(),(a).end()
typedef pair<int, int> pr;
typedef vector<int> VI;
typedef vector<pr> VP;
typedef vector<string> VS;
typedef vector<vector<int>> VV;
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define trace1(x) cout<<#x<<": "<<x<<endl
#define trace2(x, y) cout<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
#define trace3(x, y, z) cout<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
#define trace4(a, b, c, d) cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
#define trace5(a, b, c, d, e) cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
#define trace6(a, b, c, d, e, f) cout<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl
#define trace(v) for(auto it=v.begin();it!=v.end();it++)cout<<*it<<" ";cout<<endl;
const int inf = 1e17;
const int MAXN = 200001;
int fast_pow(int x, int y, int p);
int ans = 0;
VI g[MAXN];
VI a(MAXN);
VI dp(MAXN); // Stores sum of value of subtree including current node
void dfs1(int pos = 1,int pr = 0){
dp[pos] = a[pos];
for(auto x: g[pos]){
if(x!=pr){
dfs1(x,pos);
dp[pos] += dp[x];
}
}
}
void dfs2(int pos = 1, int pr = 0 , int upper = 0){
priority_queue<int,VI,greater<int>> pq;
if(pr){
upper = upper + dp[pr] - dp[pos];
pq.emplace(upper);
}
for(auto x:g[pos]){
if(x==pr)continue;
pq.emplace(dp[x]);
dfs2(x,pos,upper);
if(pq.size()==3){
pq.pop();
}
}
if(pq.size()==2){
int op1 = pq.top();pq.pop();
int op2 = pq.top();
ans = max(ans,op1+op2);
}
}
void solve() {
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=0;i<n-1;i++){
int x,y;cin>>x>>y;
g[x].EB(y);
g[y].EB(x);
}
dfs1();
dfs2();
cout<<ans<<endl;
}
int32_t main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
IOS;
int test = 1;
// cin>>test;
for (int i = 1; i <= test; i++) {
// cout<<"Case #"<<i<<": ";
solve();
}
return 0;
}
int fast_pow(int x, int y, int p) {
int res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
Ly8qKioqKiogQG1kYXptYXQ5ICoqKioqKioqKioKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgVUIgdXBwZXJfYm91bmQKI2RlZmluZSBMQiBsb3dlcl9ib3VuZAojZGVmaW5lIEJTIGJpbmFyeV9zZWFyY2gKI2RlZmluZSBFQiBlbXBsYWNlX2JhY2sKI2RlZmluZSBQQiBwdXNoX2JhY2sKI2RlZmluZSBlbmRsICJcbiIKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwojZGVmaW5lIE1PRDIgOTk4MjQ0MzUzCiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCiNkZWZpbmUgQUxMKGEpIChhKS5iZWdpbigpLChhKS5lbmQoKQp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHByOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IFZJOwp0eXBlZGVmIHZlY3Rvcjxwcj4gVlA7CnR5cGVkZWYgdmVjdG9yPHN0cmluZz4gVlM7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxpbnQ+PiBWVjsKI2RlZmluZSBJT1MgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApCiNkZWZpbmUgdHJhY2UxKHgpICAgICAgICAgICAgICAgIGNvdXQ8PCN4PDwiOiAiPDx4PDxlbmRsCiNkZWZpbmUgdHJhY2UyKHgsIHkpICAgICAgICAgICAgIGNvdXQ8PCN4PDwiOiAiPDx4PDwiIHwgIjw8I3k8PCI6ICI8PHk8PGVuZGwKI2RlZmluZSB0cmFjZTMoeCwgeSwgeikgICAgICAgICAgY291dDw8I3g8PCI6IiA8PHg8PCIgfCAiPDwjeTw8IjogIjw8eTw8IiB8ICI8PCN6PDwiOiAiPDx6PDxlbmRsCiNkZWZpbmUgdHJhY2U0KGEsIGIsIGMsIGQpICAgICAgIGNvdXQ8PCNhPDwiOiAiPDxhPDwiIHwgIjw8I2I8PCI6ICI8PGI8PCIgfCAiPDwjYzw8IjogIjw8Yzw8IiB8ICI8PCNkPDwiOiAiPDxkPDxlbmRsCiNkZWZpbmUgdHJhY2U1KGEsIGIsIGMsIGQsIGUpICAgIGNvdXQ8PCNhPDwiOiAiPDxhPDwiIHwgIjw8I2I8PCI6ICI8PGI8PCIgfCAiPDwjYzw8IjogIjw8Yzw8IiB8ICI8PCNkPDwiOiAiPDxkPDwiIHwgIjw8I2U8PCAiOiAiPDxlPDxlbmRsCiNkZWZpbmUgdHJhY2U2KGEsIGIsIGMsIGQsIGUsIGYpIGNvdXQ8PCNhPDwiOiAiPDxhPDwiIHwgIjw8I2I8PCI6ICI8PGI8PCIgfCAiPDwjYzw8IjogIjw8Yzw8IiB8ICI8PCNkPDwiOiAiPDxkPDwiIHwgIjw8I2U8PCAiOiAiPDxlPDwiIHwgIjw8I2Y8PCI6ICI8PGY8PGVuZGwKI2RlZmluZSB0cmFjZSh2KSBmb3IoYXV0byBpdD12LmJlZ2luKCk7aXQhPXYuZW5kKCk7aXQrKyljb3V0PDwqaXQ8PCIgIjtjb3V0PDxlbmRsOwpjb25zdCBpbnQgaW5mID0gMWUxNzsKY29uc3QgaW50IE1BWE4gPSAyMDAwMDE7CmludCBmYXN0X3BvdyhpbnQgeCwgaW50IHksIGludCBwKTsKCmludCBhbnMgPSAwOwpWSSBnW01BWE5dOwpWSSBhKE1BWE4pOwpWSSBkcChNQVhOKTsgLy8gU3RvcmVzIHN1bSBvZiB2YWx1ZSBvZiBzdWJ0cmVlIGluY2x1ZGluZyBjdXJyZW50IG5vZGUKCnZvaWQgZGZzMShpbnQgcG9zID0gMSxpbnQgcHIgPSAwKXsKCWRwW3Bvc10gPSBhW3Bvc107Cglmb3IoYXV0byB4OiBnW3Bvc10pewoJCWlmKHghPXByKXsKCQkJZGZzMSh4LHBvcyk7CgkJCWRwW3Bvc10gKz0gZHBbeF07CgkJfQoJfQp9Cgp2b2lkIGRmczIoaW50IHBvcyA9IDEsIGludCBwciA9IDAgLCBpbnQgdXBwZXIgPSAwKXsKCQoJcHJpb3JpdHlfcXVldWU8aW50LFZJLGdyZWF0ZXI8aW50Pj4gcHE7CglpZihwcil7CgkJdXBwZXIgPSB1cHBlciArIGRwW3ByXSAtIGRwW3Bvc107CgkJcHEuZW1wbGFjZSh1cHBlcik7Cgl9CgkKCWZvcihhdXRvIHg6Z1twb3NdKXsKCQlpZih4PT1wciljb250aW51ZTsKCQlwcS5lbXBsYWNlKGRwW3hdKTsKCQlkZnMyKHgscG9zLHVwcGVyKTsKCQlpZihwcS5zaXplKCk9PTMpewoJCQlwcS5wb3AoKTsKCQl9Cgl9CglpZihwcS5zaXplKCk9PTIpewoJCWludCBvcDEgPSBwcS50b3AoKTtwcS5wb3AoKTsKCQlpbnQgb3AyID0gcHEudG9wKCk7CgkJYW5zID0gbWF4KGFucyxvcDErb3AyKTsKCX0KfQoKCnZvaWQgc29sdmUoKSB7CglpbnQgbjtjaW4+Pm47Cglmb3IoaW50IGk9MTtpPD1uO2krKyljaW4+PmFbaV07Cglmb3IoaW50IGk9MDtpPG4tMTtpKyspewoJCWludCB4LHk7Y2luPj54Pj55OwoJCWdbeF0uRUIoeSk7CgkJZ1t5XS5FQih4KTsKCX0KCWRmczEoKTsKCWRmczIoKTsKCWNvdXQ8PGFuczw8ZW5kbDsKfQoKCmludDMyX3QgbWFpbigpIHsKI2lmbmRlZiBPTkxJTkVfSlVER0UKCWZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwoJZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKI2VuZGlmCglJT1M7CglpbnQgdGVzdCA9IDE7CgkvLyBjaW4+PnRlc3Q7Cglmb3IgKGludCBpID0gMTsgaSA8PSB0ZXN0OyBpKyspIHsKICAgICAgICAvLyBjb3V0PDwiQ2FzZSAjIjw8aTw8IjogIjsKCQlzb2x2ZSgpOwoJfQoJcmV0dXJuIDA7Cn0KaW50IGZhc3RfcG93KGludCB4LCBpbnQgeSwgaW50IHApIHsKCWludCByZXMgPSAxOwoJeCA9IHggJSBwOwoJd2hpbGUgKHkgPiAwKSB7CgkJaWYgKHkgJiAxKQoJCQlyZXMgPSAocmVzICogeCkgJSBwOwoJCXkgPSB5ID4+IDE7CgkJeCA9ICh4ICogeCkgJSBwOwoJfQoJcmV0dXJuIHJlczsKfQ==