import java.util.*;
public class Main {
static long[] sum; // sum[i] = best downward path sum starting from node i (node i is included)
static int[] b; // b[i] = value at node i
public static void DFS(int node, List<Integer>[] G, int[] used, int[] parent) {
used[node] = 1; // mark node as visited
// Explore all children first
for (int u : G[node]) {
if (used[u] == 0) {
parent[u] = node;
DFS(u, G, used, parent);
}
}
long bestChild = 0; // 0 means we can ignore negative children
for (int child : G[node]) {
if (child == parent[node]) continue; // skip parent
bestChild
= Math.
max(bestChild, sum
[child
]); }
// Include this node's value + best child path
sum[node] = b[node] + bestChild;
}
public static void main
(String[] args
) { Scanner scanner
= new Scanner
(System.
in); int n = scanner.nextInt();
sum = new long[n + 1];
b = new int[n + 1];
List
<Integer
>[] G
= new List[n
+ 1]; for (int i = 0; i <= n; i++) G[i] = new ArrayList<>();
for (int i = 1; i <= n; i++) {
b[i] = scanner.nextInt();
}
for (int i = 1; i <= n - 1; i++) {
int u = scanner.nextInt();
int v = scanner.nextInt();
G[u].add(v);
G[v].add(u);
}
int[] used = new int[n + 1];
int[] parent = new int[n + 1];
DFS(1, G, used, parent);
long answer
= Long.
MIN_VALUE ; for (int i = 1; i <= n; i++) {
answer
= Math.
max(answer, sum
[i
]); }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewpzdGF0aWMgbG9uZ1tdIHN1bTsgICAvLyBzdW1baV0gPSBiZXN0IGRvd253YXJkIHBhdGggc3VtIHN0YXJ0aW5nIGZyb20gbm9kZSBpIChub2RlIGkgaXMgaW5jbHVkZWQpCnN0YXRpYyBpbnRbXSBiOyAgICAgIC8vIGJbaV0gPSB2YWx1ZSBhdCBub2RlIGkKCgpwdWJsaWMgc3RhdGljIHZvaWQgREZTKGludCBub2RlLCBMaXN0PEludGVnZXI+W10gRywgaW50W10gdXNlZCwgaW50W10gcGFyZW50KSB7CiAgICB1c2VkW25vZGVdID0gMTsgLy8gbWFyayBub2RlIGFzIHZpc2l0ZWQKCiAgICAvLyBFeHBsb3JlIGFsbCBjaGlsZHJlbiBmaXJzdAogICAgZm9yIChpbnQgdSA6IEdbbm9kZV0pIHsKICAgICAgICBpZiAodXNlZFt1XSA9PSAwKSB7CiAgICAgICAgICAgIHBhcmVudFt1XSA9IG5vZGU7CiAgICAgICAgICAgIERGUyh1LCBHLCB1c2VkLCBwYXJlbnQpOwogICAgICAgIH0KICAgIH0KCgogICAgbG9uZyBiZXN0Q2hpbGQgPSAwOyAvLyAwIG1lYW5zIHdlIGNhbiBpZ25vcmUgbmVnYXRpdmUgY2hpbGRyZW4KICAgIGZvciAoaW50IGNoaWxkIDogR1tub2RlXSkgewogICAgICAgIGlmIChjaGlsZCA9PSBwYXJlbnRbbm9kZV0pIGNvbnRpbnVlOyAvLyBza2lwIHBhcmVudAogICAgICAgIGJlc3RDaGlsZCA9IE1hdGgubWF4KGJlc3RDaGlsZCwgc3VtW2NoaWxkXSk7CiAgICB9CgogICAgLy8gSW5jbHVkZSB0aGlzIG5vZGUncyB2YWx1ZSArIGJlc3QgY2hpbGQgcGF0aAogICAgc3VtW25vZGVdID0gYltub2RlXSArIGJlc3RDaGlsZDsKfQoKcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoU3lzdGVtLmluKTsKICAgIGludCBuID0gc2Nhbm5lci5uZXh0SW50KCk7CgogICAgc3VtID0gbmV3IGxvbmdbbiArIDFdOwogICAgYiA9IG5ldyBpbnRbbiArIDFdOwogICAgTGlzdDxJbnRlZ2VyPltdIEcgPSBuZXcgTGlzdFtuICsgMV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIEdbaV0gPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGJbaV0gPSBzY2FubmVyLm5leHRJbnQoKTsKICAgIH0KCiAgICAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG4gLSAxOyBpKyspIHsKICAgICAgICBpbnQgdSA9IHNjYW5uZXIubmV4dEludCgpOwogICAgICAgIGludCB2ID0gc2Nhbm5lci5uZXh0SW50KCk7CiAgICAgICAgR1t1XS5hZGQodik7CiAgICAgICAgR1t2XS5hZGQodSk7CiAgICB9CiAgICBpbnRbXSB1c2VkID0gbmV3IGludFtuICsgMV07CiAgICBpbnRbXSBwYXJlbnQgPSBuZXcgaW50W24gKyAxXTsKICAgIERGUygxLCBHLCB1c2VkLCBwYXJlbnQpOwogICAgbG9uZyBhbnN3ZXIgPSBMb25nLk1JTl9WQUxVRSA7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBhbnN3ZXIgPSBNYXRoLm1heChhbnN3ZXIsIHN1bVtpXSk7CiAgICB9CgkgU3lzdGVtLm91dC5wcmludGxuKGFuc3dlcik7Cn0KfQo=