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()