import math

# Đọc dữ liệu nhanh từ input
d = []
try:
    while True:
        d.extend(input().split())
except Exception:
    pass

if d:
    p = 0
    t = int(d[p])
    p += 1

    for _ in range(t):
        n = int(d[p])
        p += 1

        # Sửa lỗi: Thêm phần tử [0] ở đầu mảng
        a = [0] + [int(x) for x in d[p : p + n]]
        p += n

        b = [0] + [int(x) for x in d[p : p + n]]
        p += n

        # G: Danh sách kề của cây
        G = [[] for _ in range(n + 1)]
        for _ in range(n - 1):
            u, v = int(d[p]), int(d[p + 1])
            p += 2
            G[u].append(v)
            G[v].append(u)

        # Sửa lỗi: Khởi tạo mảng cha P và hàng đợi Q = [1]
        P = [0] * (n + 1)
        C = [[] for _ in range(n + 1)]
        Q = [1]

        h = 0
        while h < len(Q):
            u = Q[h]
            h += 1
            for v in G[u]:
                if v != P[u]:
                    P[v] = u
                    C[u].append(v)
                    Q.append(v)

        # g: Bước nhảy hiệu dụng của mỗi nút
        g = [0] * (n + 1)
        ans = 0

        # Duyệt ngược từ lá lên gốc (Bottom-up)
        for u in reversed(Q):
            if not C[u]:
                g[u] = b[u]
            else:
                s = sum(a[v] for v in C[u])
                cur = math.gcd(b[u], s)
                for v in C[u]:
                    # CHỈ TÍNH g[v] NẾU NÚT CON CÓ THỂ BIẾN ĐỔI (g[v] < b[v])
                    if g[v] < b[v]:
                        cur = math.gcd(cur, g[v])
                g[u] = cur

            # Tính giá trị lớn nhất đạt được tại nút u và cộng vào kết quả
            ans += b[u] - 1 - ((b[u] - 1 - a[u]) % g[u])

        print(ans)
