#include <bits/stdc++.h>
using namespace std;
using ll = long long;
long long readInt(long long l,long long r,char endd){
long long x=0;
int cnt=0;
int fi=-1;
bool is_neg=false;
while(true){
char g=getchar();
if(g=='-'){
assert(fi==-1);
is_neg=true;
continue;
}
if('0'<=g && g<='9'){
x*=10;
x+=g-'0';
if(cnt==0){
fi=g-'0';
}
cnt++;
assert(fi!=0 || cnt==1);
assert(fi!=0 || is_neg==false);
assert(!(cnt>19 || ( cnt==19 && fi>1) ));
} else if(g==endd){
if(is_neg){
x= -x;
}
assert(l<=x && x<=r);
return x;
} else {
assert(false);
}
}
}
string readString(int l,int r,char endd){
string ret="";
int cnt=0;
while(true){
char g=getchar();
assert(g!=-1);
if(g==endd){
break;
}
cnt++;
ret+=g;
}
assert(l<=cnt && cnt<=r);
return ret;
}
long long readIntSp(long long l,long long r){
return readInt(l,r,' ');
}
long long readIntLn(long long l,long long r){
return readInt(l,r,'\n');
}
string readStringLn(int l,int r){
return readString(l,r,'\n');
}
string readStringSp(int l,int r){
return readString(l,r,' ');
}
long long P10(int x){
return x == 0 ? 1 : 10 * P10(x - 1);
}
template <typename T, typename R = long long>
vector<T> readArr(int len, R l, R r){
vector<T> a(len);
for(int i = 0; i < len; i++){
if(i + 1 < len){
a[i] = readIntSp(l, r);
} else {
a[i] = readIntLn(l, r);
}
}
return a;
}
struct union_find {
vector<int> parent;
int n;
union_find(int n) : n(n) { clear(); }
inline void clear(){ parent.assign(n, -1); }
inline int find(int u){ return (parent[u] < 0) ? u : parent[u] = find(parent[u]); }
inline bool same(int u, int v){ return find(u) == find(v); }
inline bool join(int u, int v){
u = find(u);
v = find(v);
if (u != v){
if (parent[u] > parent[v])
swap(u, v);
parent[u] += parent[v];
parent[v] = u;
}
return u != v;
}
inline int size(int u){ return -parent[find(u)]; }
};
struct forest {
vector<pair<int,int>> edges;
vector<vector<int>> to, lg_parents;
vector<int> sub, color, parent, depth, pre, ord, in, out;
int comps, n, lgn, C;
forest(int n): n(n) {
to.resize(n);
sub.assign(n, 0);
color.assign(n, 0);
parent.resize(n);
depth.assign(n, 0);
in.resize(n);
out.resize(n);
}
void add_edge(int u, int v){
int id = edges.size();
assert(id < n - 1);
edges.push_back(make_pair(u, v));
to[u].push_back(id);
to[v].push_back(id);
}
inline int adj(int u, int id){ return u ^ edges[id].first ^ edges[id].second; }
void dfs(int u, int p){
pre.push_back(u);
in[u] = C++;
color[u] = comps;
parent[u] = p;
sub[u] = 1;
for(int id : to[u]){
int v = adj(u, id);
if(v == p) continue;
depth[v] = depth[u] + 1;
dfs(v, u);
sub[u] += sub[v];
}
out[u] = C;
ord.push_back(u);
}
bool is_ancestor(int u, int v){
return in[u] <= in[v] && out[v] <= out[u];
}
void dfs_all(){
comps = 0;
C = 0;
for(int i = 0; i < n; i++){
if(!color[i]){
++comps;
dfs(i, -1);
}
}
}
void build_parents(){
lgn = 0;
while((1<<lgn) <= n) lgn++;
lg_parents.assign(lgn, vector<int>(n, -1));
for(int i = 0; i < n; i++)
lg_parents[0][i] = parent[i];
for(int i = 1; i < lgn; i++){
for(int j = 0; j < n; j++){
if(~lg_parents[i - 1][j]){
lg_parents[i][j] = lg_parents[i - 1][lg_parents[i - 1][j]];
}
}
}
}
int jump(int u, int k){
for(int i = lgn - 1; i >= 0; i--) if(k&(1<<i)) u = lg_parents[i][u];
return u;
}
int lca(int u, int v){
if(depth[u] < depth[v]) swap(u, v);
for(int i = lgn - 1; i >= 0; i--)
if((depth[u] - depth[v])&(1<<i))
u = lg_parents[i][u];
if(u == v)
return u;
for(int i = lgn - 1; i >= 0; i--)
if(lg_parents[i][u] != lg_parents[i][v]){
u = lg_parents[i][u];
v = lg_parents[i][v];
}
return lg_parents[0][u];
}
int dist(int u, int v){
return depth[u] + depth[v] - 2 * depth[lca(u, v)];
}
};
int main(){
int t = readIntLn(1, 10);
for(int ct = 1; ct <= t; ct++){
int n = readIntSp(1, P10(5));
int k = readIntLn(1, n);
auto good = readArr<int>(k, 1, n);
for(int & v : good) v--;
union_find uf(n);
forest fo(n);
vector<vector<int>> adj(n);
for(int i = 1; i < n; i++){
int u = readIntSp(1, n);
int v = readIntLn(1, n);
assert(u != v);
u--; v--;
assert(uf.join(u, v));
fo.add_edge(u, v);
adj[u].push_back(v);
adj[v].push_back(u);
}
fo.dfs_all();
fo.build_parents();
vector<ll> dist_sum(n);
vector<int> sub(n);
for(int v : good){
dist_sum[0] += fo.depth[v];
sub[v] = 1;
}
auto dfs = [&](auto self, int u, int p) -> void {
for(int v : adj[u]){
if(v == p) continue;
self(self, v, u);
sub[u] += sub[v];
}
};
dfs(dfs, 0, -1);
auto fix = [&](auto self, int u, int p) -> void {
if(p != -1){
dist_sum[u] = dist_sum[p];
dist_sum[u] -= sub[u];
dist_sum[u] += k - sub[u];
}
for(int v : adj[u]){
if(v == p) continue;
self(self, v, u);
}
};
fix(fix, 0, -1);
int u = good[0], v = good[0], w = good[0];
for(int e : good) {
if(fo.dist(u, e) > fo.dist(u, v)){
v = e;
}
}
for(int e : good){
if(fo.dist(v, e) > fo.dist(v, w)){
w = e;
}
}
for(int i = 0; i < n; i++){
dist_sum[i] -= max(fo.dist(i, v), fo.dist(i, w));
}
int K = 0;
for(int i = 0; i < n; i++){
if(dist_sum[i] <= dist_sum[K]){
K = i;
}
}
cout << K + 1 << '\n';
}
return 0;
}