from collections import deque
import sys


while True:
    try:
        input = sys.stdin.read
        data = input().split()
        n = int(data[0])
        edges = [[] for _ in range(n + 1)]  # edges[i]表示和节点i相连的节点
        idx = 1
        for _ in range(n - 1):
            u, v = int(data[idx]), int(data[idx + 1])
            idx += 2
            edges[u].append(v)
            edges[v].append(u)

        parent = [0] * (n + 1)  # parent[i]表示节点i的父节点
        children = [[] for _ in range(n + 1)]   # children[i]表示节点i的子节点
        q = deque([1])  # 创建一个双端队列,并初始化为[1]
        parent[1] = 0
        while q:
            u = q.popleft()     # 广度优先遍历,构建树
            for v in edges[u]:
                if v != parent[u]:
                    parent[v] = u
                    children[u].append(v)
                    q.append(v)

        k = int(data[idx])
        idx += 1
        V = list(map(int, data[idx:idx + k]))
        idx += k

        # 标记是否在集合 V 中
        is_in_V = [0] * (n + 1)
        for node in V:
            is_in_V[node] = 1

        # 计算 s 数组
        s = [0] * (n + 1)   # s[i]表示节点i的子树上在集合V中的节点的个数
        stack = [(1, False)]
        while stack:
            node, visited = stack.pop()
            if not visited:
                stack.append((node, True))
                # 逆序压入子节点以保证处理顺序正确
                for child in reversed(children[node]):
                    stack.append((child, False))
            else:
                s_val = is_in_V[node]
                for child in children[node]:
                    s_val += s[child]
                s[node] = s_val

        # 计算 cnt 数组
        cnt = [0] * (n + 1)
        for i in range(1, n + 1):
            total = s[i] * s[i]
            sum_child = sum(s[child] * s[child] for child in children[i])
            cnt[i] = total - sum_child
            # 从节点i的子树上任取2个节点,这两个节点刚好落在两个不同子树的可能情况,即为cnt[i]

        # 输出结果
        print(*cnt[1:])
    except:
        break