You are given a tree with $N$ nodes (numbered $1$ through $N$). There are $K$ special nodes $f_{1},f_{2},\ldots,f_{K}$ in this tree.

We define $d(p,q)$ to be the number of edges on the unique path from node $p$ to node $q$.

You are given a node $a$. For each node $b$ from $1$ to $N$, find the maximum value of $d(a,u)-d(b,u)$ where $u$ is a special node, as well as any special node $u$ for which that maximum value is attained.

------ Input ------
The first line of the input contains a single integer $T$ denoting the number of test cases. The description of $T$ test cases follows.
The first line of each test case contains three space-separated integers $N$, $K$, $a$.
The second line contains $K$ space-separated integers $f_{1},f_{2},\ldots,f_{K}$.
$N-1$ lines follow. For each valid $i$, the $i$-th of these lines contains two space-separated integers $u_{i}$ and $v_{i}$ denoting an edge of the tree.

------ Output ------
For each test case, print two lines.

In the first line print $N$ space-separated integers. For each valid $i$, the $i$-th integer should be the maximum value of $d(a,u)-d(i,u)$ where $u$ is a special node.

In the second line print $N$ space-separated integers. For each valid $i$, the $i$-th integer should be any special node $u$ for which the maximum of $d(a,u)-d(i,u)$ is attained.

------ Constraints  ------
$1 ≤ T ≤ 200$
$1 ≤ K ≤ N ≤ 2 \cdot 10^{5}$
$1 ≤ a ≤ N$
$1 ≤ f_{i} ≤ N$ for each valid $i$
$f_{i} \neq f_{j}$ for each valid $i$ and $j$ such that $i \neq j$
$1 ≤ u_{i},v_{i} ≤ N$ for each valid $i$
the graph described on the input is a tree 
the sum of $N$ over all test cases does not exceed $4 \cdot 10^{5}$

------ Subtasks ------

Subtask #1 (10 points):
$T ≤ 11$
$N ≤ 200$
the sum of $N$ over all test cases does not exceed $400$

Subtask #2 (20 points):
$T ≤ 51$
$N ≤ 2000$
the sum of $N$ over all test cases does not exceed $4000$

Subtask #3 (30 points): 
It holds that $u_{i}=i$, $v_{i}=i+1$ for each valid $i$.

Subtask #4 (40 points): original constraints

------ Sample Input ------

2
5 1 3
2
1 2
1 3
2 4
2 5
8 3 2
6 5 8
1 2
2 3
2 4
2 5
4 6
5 7
5 8

------ Sample Output ------

1 2 0 1 1
2 2 2 2 2
-1 0 -1 1 1 2 0 2
5 5 5 6 5 6 5 8

------ Explanation ------
Example case 1:  The following picture shows the tree in the first example case with special nodes in bold:

The only special node is the node $2$ and $a=3$. Therefore, the desired maximum is $d(a,2)-d(b,2)=d(3,2)-d(b,2)=2-d(b,2)$ for each node $b$ and it is always attained for the special node $u=2$.

Example case 2: The following picture shows the tree in the second example case with special nodes bolded:

The special nodes are $6$, $5$ and $8$, and $a=2$. The maximum values of $d(a,u)-d(b,u)$ ($u$ being a special node) for each $b$ are as follows:

$b=1$: The maximum value of $d(2,u)-d(1,u)$ is $-1$ and it is achieved for $u=5$ since $d(2,5)-d(1,5)=1-2=-1$.

$b=2$: The maximum value of $d(2,u)-d(2,u)$ is $0$ and it is achieved for $u=5$ since $d(2,5)-d(2,5)=1-1=0$.

$b=3$: The maximum value of $d(2,u)-d(3,u)$ is $-1$ and it is achieved for $u=5$ since $d(2,5)-d(3,5)=1-2=-1$.

$b=4$: The maximum value of $d(2,u)-d(4,u)$ is $1$ and it is achieved for $u=6$ since $d(2,6)-d(4,6)=2-1=1$.

$b=5$: The maximum value of $d(2,u)-d(5,u)$ is $1$ and it is achieved for $u=5$ since $d(2,5)-d(5,5)=1-0=1$.

$b=6$: The maximum value of $d(2,u)-d(6,u)$ is $2$ and it is achieved for $u=6$ since $d(2,6)-d(6,6)=2-0=2$.

$b=7$: The maximum value of $d(2,u)-d(7,u)$ is $0$ and it is achieved for $u=5$ since $d(2,5)-d(7,5)=1-1=0$.

$b=8$: The maximum value of $d(2,u)-d(8,u)$ is $2$ and it is achieved for $u=8$ since $d(2,8)-d(8,8)=2-0=2$.

Difficulty: VERY_HARD

Solutions:
import sys
sys.setrecursionlimit(10 ** 7)

class Graph:

	def __init__(self, N):
		self.N = N
		self.adj = [[] for i in range(N + 1)]
		self.hasSpInSub = [False] * (N + 1)
		self.nearestAncestor = [0] * (N + 1)
		self.level = [0] * (N + 1)
		self.anySpNode = [0] * (N + 1)

	def addEdge(self, a, b):
		self.adj[a].append(b)
		self.adj[b].append(a)

	def prep(self, a, dic):

		def dfs(node, par, depth):
			self.level[node] = depth
			for cnode in self.adj[node]:
				if cnode == par:
					continue
				v = dfs(cnode, node, depth + 1)
				if v:
					self.anySpNode[node] = v
				self.hasSpInSub[node] = v or self.hasSpInSub[node]
			if node in dic:
				self.hasSpInSub[node] = True
				self.anySpNode[node] = node
			return self.anySpNode[node]
		dfs(a, 0, 0)

		def dfs1(node, par, latestSpecialAncestor):
			if self.hasSpInSub[node]:
				latestSpecialAncestor = node
			self.nearestAncestor[node] = latestSpecialAncestor
			for cnode in self.adj[node]:
				if cnode == par:
					continue
				dfs1(cnode, node, latestSpecialAncestor)
		dfs1(a, 0, a)

	def show(self):
		for node in range(1, self.N + 1):
			print('node', node, 'Has Special Node', self.hasSpInSub[node])
		print()
		for node in range(1, self.N + 1):
			print('Node', node, 'Nearest Special Ancestor', self.nearestAncestor[node])
		print('-' * 40)

	def dist(self, u, v):
		return self.level[v] - self.level[u]

def solve(N, f, a):
	spNodes = {}
	for node in f:
		spNodes[node] = 1
	gr = Graph(N)
	for i in range(N - 1):
		(u, v) = map(int, input().split())
		gr.addEdge(u, v)
	gr.prep(a, spNodes)
	Distances = []
	SpecialNode = []
	for b in range(1, N + 1):
		nearestAncestor = gr.nearestAncestor[b]
		v = gr.dist(a, nearestAncestor) - gr.dist(nearestAncestor, b)
		Distances.append(v)
		SpecialNode.append(gr.anySpNode[nearestAncestor])
	print(*Distances)
	print(*SpecialNode)
for case in range(int(input())):
	(N, K, a) = map(int, input().split())
	f = list(map(int, input().split()))
	solve(N, f, a)


from sys import stdin, stdout
from collections import defaultdict as dd
from collections import deque
import math
import sys
import random
sys.setrecursionlimit(int(10000000.0))
input = stdin.readline
flush = stdout.flush
p = int(1000000000.0) + 7

def dfs(root, x):
	vis[root] = True
	dis[root] = x
	for i in d[root]:
		if vis[i] == False:
			dfs(i, x + 1)

def dfs2(root):
	has_after = -1
	vis[root] = True
	for i in d[root]:
		if vis[i] == False:
			has_after = max(dfs2(i), has_after)
			if i in f:
				has_after = i
	if root in f:
		has_after = root
	if has_after != -1:
		pos[root] = has_after
	return has_after

def dfs3(root, b, repp):
	has_above = b
	has_rep = repp
	if pos[root] != -1:
		has_above = root
		has_rep = pos[root]
	abv[root] = has_above
	rep[root] = has_rep
	vis[root] = True
	for i in d[root]:
		if vis[i] == False:
			dfs3(i, has_above, has_rep)
tc = 1
tc = int(input())
for _ in range(tc):
	(n, k, a) = map(int, input().split())
	a -= 1
	f = list(map(int, input().split()))
	for i in range(k):
		f[i] -= 1
	f = set(f)
	d = dd(lambda : [])
	for i in range(n - 1):
		(u, v) = map(int, input().split())
		u -= 1
		v -= 1
		d[u].append(v)
		d[v].append(u)
	vis = [False for i in range(n)]
	dis = [-1 for i in range(n)]
	dfs(a, 0)
	vis = [False for i in range(n)]
	pos = [-1 for i in range(n)]
	pos[a] = dfs2(a)
	vis = [False for i in range(n)]
	abv = [-1 for i in range(n)]
	rep = [-1 for i in range(n)]
	dfs3(a, -1, -1)
	a1 = []
	a2 = []
	for i in range(n):
		if pos[i] != -1:
			a1.append(dis[i])
			a2.append(pos[i] + 1)
		elif abv[i] != -1:
			ds1 = dis[abv[i]]
			ds2 = dis[i] - dis[abv[i]]
			a1.append(ds1 - ds2)
			a2.append(rep[i] + 1)
	print(*a1)
	print(*a2)