import sys from sys import stdin sys.setrecursionlimit(1 << 25) def main(): N = int(stdin.readline()) a = list(map(int, stdin.readline().split())) b = list(map(int, stdin.readline().split())) edges = [[] for _ in range(N+1)] for _ in range(N-1): u, v = map(int, stdin.readline().split()) edges[u].append(v) edges[v].append(u) root = 1 parent = [0] * (N + 1) children = [[] for _ in range(N + 1)] stack = [(root, 0)] while stack: u, p = stack.pop() parent[u] = p for v in edges[u]: if v != p: children[u].append(v) stack.append((v, u)) max_score = [[-1e18] * 2 for _ in range(N + 1)] post_stack = [] visited = [False] * (N + 1) post_order = [] stack = [(root, False)] while stack: u, done = stack.pop() if done: post_order.append(u) continue visited[u] = True stack.append((u, True)) for v in reversed(children[u]): stack.append((v, False)) for u in post_order: sum_child_0 = 0 sum_child_1 = 0 for v in children[u]: sum_child_0 += max_score[v][0] sum_child_1 += max_score[v][1] score0_p0 = sum_child_0 score1_p0 = -a[u-1] + sum_child_1 max0 = max(score0_p0, score1_p0) if parent[u] == 0: score0_p1 = 0 score1_p1 = 0 else: score0_p1 = sum_child_0 score1_p1 = -a[u-1] + (b[u-1] + b[parent[u]-1]) + sum_child_1 max1 = max(score0_p1, score1_p1) if parent[u] != 0 else max0 max_score[u][0] = max0 max_score[u][1] = max1 if parent[u] != 0 else max_score[u][1] total_a = sum(a) ans = total_a + max_score[root][0] print(ans) if __name__ == "__main__": main()