#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 200005;
int n, w[N];
vector<int> adj[N];
int sub[N];
int best1[N], best2[N]; // 2 nhánh con tốt nhất
int res = 0;
void dfs1(int u, int p) {
sub[u] = w[u];
best1[u] = best2[u] = 0;
for (int v : adj[u]) if (v != p) {
dfs1(v, u);
sub[u] += sub[v];
int val = sub[v];
if (val > best1[u]) {
best2[u] = best1[u];
best1[u] = val;
} else if (val > best2[u]) {
best2[u] = val;
}
}
}
void dfs2(int u, int p) {
// cập nhật đáp án tại u
res = max(res, sub[u] + best1[u] + best2[u]);
for (int v : adj[u]) if (v != p) {
// giả sử ta reroot sang v
int su = sub[u], sv = sub[v];
// giá trị "ngoài v" khi xem từ u
int outside = su - sv;
int candidate = outside;
// Nếu v chính là best1[u] thì nhánh mạnh nhất ngoài v là best2[u]
if (sub[v] == best1[u]) candidate = max(candidate, best2[u]);
else candidate = max(candidate, best1[u]);
// cập nhật best cho v bằng cách xét nhánh từ u
int old1 = best1[v], old2 = best2[v];
if (candidate > best1[v]) {
best2[v] = best1[v];
best1[v] = candidate;
} else if (candidate > best2[v]) {
best2[v] = candidate;
}
// reroot
sub[v] = sv + (su - sv);
dfs2(v, u);
// rollback
sub[v] = sv;
best1[v] = old1;
best2[v] = old2;
}
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> w[i];
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs1(1, 0);
dfs2(1, 0);
cout << res << "\n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBsb25nIGxvbmcKY29uc3QgaW50IE4gPSAyMDAwMDU7CgppbnQgbiwgd1tOXTsKdmVjdG9yPGludD4gYWRqW05dOwppbnQgc3ViW05dOwppbnQgYmVzdDFbTl0sIGJlc3QyW05dOyAvLyAyIG5ow6FuaCBjb24gdOG7kXQgbmjhuqV0CmludCByZXMgPSAwOwoKdm9pZCBkZnMxKGludCB1LCBpbnQgcCkgewogICAgc3ViW3VdID0gd1t1XTsKICAgIGJlc3QxW3VdID0gYmVzdDJbdV0gPSAwOwoKICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIGlmICh2ICE9IHApIHsKICAgICAgICBkZnMxKHYsIHUpOwogICAgICAgIHN1Ylt1XSArPSBzdWJbdl07CiAgICAgICAgaW50IHZhbCA9IHN1Ylt2XTsKICAgICAgICBpZiAodmFsID4gYmVzdDFbdV0pIHsKICAgICAgICAgICAgYmVzdDJbdV0gPSBiZXN0MVt1XTsKICAgICAgICAgICAgYmVzdDFbdV0gPSB2YWw7CiAgICAgICAgfSBlbHNlIGlmICh2YWwgPiBiZXN0Mlt1XSkgewogICAgICAgICAgICBiZXN0Mlt1XSA9IHZhbDsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgZGZzMihpbnQgdSwgaW50IHApIHsKICAgIC8vIGPhuq1wIG5o4bqtdCDEkcOhcCDDoW4gdOG6oWkgdQogICAgcmVzID0gbWF4KHJlcywgc3ViW3VdICsgYmVzdDFbdV0gKyBiZXN0Mlt1XSk7CgogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgaWYgKHYgIT0gcCkgewogICAgICAgIC8vIGdp4bqjIHPhu60gdGEgcmVyb290IHNhbmcgdgogICAgICAgIGludCBzdSA9IHN1Ylt1XSwgc3YgPSBzdWJbdl07CgogICAgICAgIC8vIGdpw6EgdHLhu4sgIm5nb8OgaSB2IiBraGkgeGVtIHThu6sgdQogICAgICAgIGludCBvdXRzaWRlID0gc3UgLSBzdjsKICAgICAgICBpbnQgY2FuZGlkYXRlID0gb3V0c2lkZTsKCiAgICAgICAgLy8gTuG6v3UgdiBjaMOtbmggbMOgIGJlc3QxW3VdIHRow6wgbmjDoW5oIG3huqFuaCBuaOG6pXQgbmdvw6BpIHYgbMOgIGJlc3QyW3VdCiAgICAgICAgaWYgKHN1Ylt2XSA9PSBiZXN0MVt1XSkgY2FuZGlkYXRlID0gbWF4KGNhbmRpZGF0ZSwgYmVzdDJbdV0pOwogICAgICAgIGVsc2UgY2FuZGlkYXRlID0gbWF4KGNhbmRpZGF0ZSwgYmVzdDFbdV0pOwoKICAgICAgICAvLyBj4bqtcCBuaOG6rXQgYmVzdCBjaG8gdiBi4bqxbmcgY8OhY2ggeMOpdCBuaMOhbmggdOG7qyB1CiAgICAgICAgaW50IG9sZDEgPSBiZXN0MVt2XSwgb2xkMiA9IGJlc3QyW3ZdOwogICAgICAgIGlmIChjYW5kaWRhdGUgPiBiZXN0MVt2XSkgewogICAgICAgICAgICBiZXN0Mlt2XSA9IGJlc3QxW3ZdOwogICAgICAgICAgICBiZXN0MVt2XSA9IGNhbmRpZGF0ZTsKICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZSA+IGJlc3QyW3ZdKSB7CiAgICAgICAgICAgIGJlc3QyW3ZdID0gY2FuZGlkYXRlOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVyb290CiAgICAgICAgc3ViW3ZdID0gc3YgKyAoc3UgLSBzdik7CgogICAgICAgIGRmczIodiwgdSk7CgogICAgICAgIC8vIHJvbGxiYWNrCiAgICAgICAgc3ViW3ZdID0gc3Y7CiAgICAgICAgYmVzdDFbdl0gPSBvbGQxOwogICAgICAgIGJlc3QyW3ZdID0gb2xkMjsKICAgIH0KfQoKaW50MzJfdCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IHdbaV07CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgfQoKICAgIGRmczEoMSwgMCk7CiAgICBkZnMyKDEsIDApOwoKICAgIGNvdXQgPDwgcmVzIDw8ICJcbiI7Cn0K