import java.util.*;
public class Main {
static long[] subtree;
static int[] b;
static void DFS(int node, int parent, List<Integer>[] G) {
subtree[node] = b[node];
for (int child : G[node]) {
if (child == parent) {
continue;
}
DFS(child, node, G);
subtree[node] += subtree[child];
}
}
public static void main
(String[] args
) {
Scanner scanner
= new Scanner
(System.
in);
int n = scanner.nextInt();
b = new int[n + 1];
subtree = new long[n + 1];
for (int i = 1; i <= n; i++) {
b[i] = scanner.nextInt();
}
List
<Integer
>[] G
= new List[n
+ 1];
for (int i = 1; i <= n; i++) {
G[i] = new ArrayList<>();
}
for (int i = 0; i < n - 1; i++) {
int u = scanner.nextInt();
int v = scanner.nextInt();
G[u].add(v);
G[v].add(u);
}
// Root tree at 1
DFS(1, 0, G);
long total = subtree[1];
long answer
= Long.
MAX_VALUE;
// Cut the edge parent[i] -- i
// i.e. consider every non-root node
// visualise nodes and understand .. node[1] is total sum
// node 2 will have only subtree[2] sum and none of node[1](root) and its
// other child subtree's sum
for (int i = 2; i <= n; i++) {
long part1 = subtree[i];
long part2 = total - subtree[i];
long difference
= Math.
abs(part1
- part2
);
answer
= Math.
min(answer, difference
); }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHN0YXRpYyBsb25nW10gc3VidHJlZTsKICAgIHN0YXRpYyBpbnRbXSBiOwoKICAgIHN0YXRpYyB2b2lkIERGUyhpbnQgbm9kZSwgaW50IHBhcmVudCwgTGlzdDxJbnRlZ2VyPltdIEcpIHsKCiAgICAgICAgc3VidHJlZVtub2RlXSA9IGJbbm9kZV07CgogICAgICAgIGZvciAoaW50IGNoaWxkIDogR1tub2RlXSkgewoKICAgICAgICAgICAgaWYgKGNoaWxkID09IHBhcmVudCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERGUyhjaGlsZCwgbm9kZSwgRyk7CgogICAgICAgICAgICBzdWJ0cmVlW25vZGVdICs9IHN1YnRyZWVbY2hpbGRdOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgogICAgICAgIFNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CgogICAgICAgIGludCBuID0gc2Nhbm5lci5uZXh0SW50KCk7CgogICAgICAgIGIgPSBuZXcgaW50W24gKyAxXTsKICAgICAgICBzdWJ0cmVlID0gbmV3IGxvbmdbbiArIDFdOwoKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgYltpXSA9IHNjYW5uZXIubmV4dEludCgpOwogICAgICAgIH0KCiAgICAgICAgTGlzdDxJbnRlZ2VyPltdIEcgPSBuZXcgTGlzdFtuICsgMV07CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBHW2ldID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKCiAgICAgICAgICAgIGludCB1ID0gc2Nhbm5lci5uZXh0SW50KCk7CiAgICAgICAgICAgIGludCB2ID0gc2Nhbm5lci5uZXh0SW50KCk7CgogICAgICAgICAgICBHW3VdLmFkZCh2KTsKICAgICAgICAgICAgR1t2XS5hZGQodSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSb290IHRyZWUgYXQgMQogICAgICAgIERGUygxLCAwLCBHKTsKCiAgICAgICAgbG9uZyB0b3RhbCA9IHN1YnRyZWVbMV07CgogICAgICAgIGxvbmcgYW5zd2VyID0gTG9uZy5NQVhfVkFMVUU7CgogICAgICAgIC8vIEN1dCB0aGUgZWRnZSBwYXJlbnRbaV0gLS0gaQogICAgICAgIC8vIGkuZS4gY29uc2lkZXIgZXZlcnkgbm9uLXJvb3Qgbm9kZQogICAgICAgIC8vIHZpc3VhbGlzZSBub2RlcyBhbmQgdW5kZXJzdGFuZCAuLiBub2RlWzFdIGlzIHRvdGFsIHN1bSAKICAgICAgICAvLyBub2RlIDIgd2lsbCBoYXZlIG9ubHkgc3VidHJlZVsyXSBzdW0gYW5kIG5vbmUgb2Ygbm9kZVsxXShyb290KSBhbmQgaXRzCiAgICAgICAgLy8gb3RoZXIgY2hpbGQgc3VidHJlZSdzIHN1bQogICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IG47IGkrKykgewoKICAgICAgICAgICAgbG9uZyBwYXJ0MSA9IHN1YnRyZWVbaV07CiAgICAgICAgICAgIGxvbmcgcGFydDIgPSB0b3RhbCAtIHN1YnRyZWVbaV07CgogICAgICAgICAgICBsb25nIGRpZmZlcmVuY2UgPSBNYXRoLmFicyhwYXJ0MSAtIHBhcnQyKTsKCiAgICAgICAgICAgIGFuc3dlciA9IE1hdGgubWluKGFuc3dlciwgZGlmZmVyZW5jZSk7CiAgICAgICAgfQoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYW5zd2VyKTsKICAgIH0KfQ==