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