import sys from collections import deque def main(): sys.setrecursionlimit(1 << 25) input = sys.stdin.read().split() idx = 0 N, K = int(input[idx]), int(input[idx+1]) idx += 2 edges = [[] for _ in range(N + 1)] for _ in range(N - 1): u = int(input[idx]) v = int(input[idx + 1]) edges[u].append(v) edges[v].append(u) idx += 2 D = list(map(int, input[idx:idx + K])) idx += K if K == 1: d1 = D[0] dist = [-1] * (N + 1) q = deque() q.append(d1) dist[d1] = 0 while q: u = q.popleft() for v in edges[u]: if dist[v] == -1: dist[v] = dist[u] + 1 q.append(v) for x in range(1, N + 1): print(dist[x]) return parent = [0] * (N + 1) depth = [0] * (N + 1) q = deque() root = 1 q.append(root) parent[root] = 0 depth[root] = 0 visited = [False] * (N + 1) visited[root] = True while q: u = q.popleft() for v in edges[u]: if not visited[v] and v != parent[u]: parent[v] = u depth[v] = depth[u] + 1 visited[v] = True q.append(v) LOG = 20 up = [[0] * (N + 1) for _ in range(LOG)] up[0] = parent for k in range(1, LOG): for v in range(1, N + 1): up[k][v] = up[k-1][up[k-1][v]] def lca(u, v): if depth[u] < depth[v]: u, v = v, u for k in reversed(range(LOG)): if depth[u] - (1 << k) >= depth[v]: u = up[k][u] if u == v: return u for k in reversed(range(LOG)): if up[k][u] != up[k][v]: u = up[k][u] v = up[k][v] return parent[u] S = D s = S[0] max_dist = -1 u = s dist = [-1] * (N + 1) q = deque([s]) dist[s] = 0 while q: current = q.popleft() for neighbor in edges[current]: if dist[neighbor] == -1: dist[neighbor] = dist[current] + 1 q.append(neighbor) for node in S: if dist[node] > max_dist: max_dist = dist[node] u = node dist = [-1] * (N + 1) q = deque([u]) dist[u] = 0 while q: current = q.popleft() for neighbor in edges[current]: if dist[neighbor] == -1: dist[neighbor] = dist[current] + 1 q.append(neighbor) max_dist = -1 v = u for node in S: if dist[node] > max_dist: max_dist = dist[node] v = node A = u B = v current_lca = S[0] for node in S[1:]: current_lca = lca(current_lca, node) R = current_lca edge_set = set() for node in S: current = node while current != R: p = parent[current] a = min(current, p) b = max(current, p) edge_set.add((a, b)) current = p E = len(edge_set) def bfs(start): dist = [-1] * (N + 1) q = deque([start]) dist[start] = 0 while q: u = q.popleft() for v in edges[u]: if dist[v] == -1: dist[v] = dist[u] + 1 q.append(v) return dist dist_A = bfs(A) dist_B = bfs(B) for x in range(1, N + 1): max_d = max(dist_A[x], dist_B[x]) res = 2 * E - max_d print(res) if __name__ == "__main__": main()