//https://codeforces.com/contest/1790/problem/F
#include <bits/stdc++.h>
#define ll long long
#define all(a) (a).begin(), (a).end()
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 10;
/*
O(nsqrt(n))
在链/树上插入sqrt(n)个点后,距离最近的两个点的距离小于sqrt(n)
bfs暴力修改一个点到最近染色点的距离,只有距离小于ans才更新
前sqrt(n)会把ans更新到小于sqrt(n), 所以后面每次更新都不会超过sqrt(n)步
*/
int n, dis[N], ans;
vector<int> g[N];
void init()
{
ans = inf;
for(int i = 1; i <= n; i++)
{
dis[i] = inf;
g[i].clear();
}
}
void bfs(int x)
{
queue<int> que;
dis[x] = 0;
que.push(x);
while(que.size())
{
int now = que.front();
que.pop();
for(auto &to : g[now])
{
if(dis[now] + 1 < ans && dis[now] + 1 < dis[to])
{
dis[to] = dis[now] + 1;
que.push(to);
}
}
}
}
void solve()
{
int c0;
cin >> n >> c0;
init();
vector<int> c(n - 1);
for(int i = 0; i < n - 1; i++) cin >> c[i];
for(int i = 1, u, v; i < n; i++)
{
cin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
bfs(c0);
for(int i = 0; i < n - 1; i++)
{
ans = min(ans, dis[c[i]]);
cout << ans << " \n"[i == n - 2];
bfs(c[i]);
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}