#include <bits/stdc++.h> #define ll long long int using namespace std; bool is_tourist[100005]; int f_subtree[100005]; int f_sum[100005]; int f_max[100005][2]; int n, k; void dfs1(int node, vector<vector<int>> &adj, int pa, int dist) { for (auto child : adj[node]) { if (child == pa) continue; dfs1(child, adj, node, dist + 1); f_subtree[node] += f_subtree[child]; if (f_subtree[child] > 0) { f_max[node][0] = max(f_max[node][0], f_max[child][0] + 1); } } if (is_tourist[node]) ++f_subtree[node], f_sum[1] += dist; } void dfs2(int node, vector<vector<int>> &adj, int pa) { set<int> max_dis; for (auto child : adj[node]) { if (child == pa) continue; max_dis.insert(f_max[child][0]); } for (auto child : adj[node]) { if (child == pa) continue; int curr = f_max[child][0]; max_dis.erase(curr); int val = 0; if (!max_dis.empty()) val = (*max_dis.rbegin()) + 2; val = max(val, f_max[node][1] + 1); f_max[child][1] = val; f_sum[child] = f_sum[node] + (k - f_subtree[child]) - f_subtree[child]; dfs2(child, adj, node); max_dis.insert(curr); } } void mainSolve() { cin >> n >> k; memset(is_tourist, false, sizeof(is_tourist)); memset(f_subtree, false, sizeof(f_subtree)); memset(f_max, 0, sizeof(f_max)); memset(f_sum, 0, sizeof(f_sum)); vector<vector<int>> adj(n + 1); for (int i = 0; i < k; i++) { int x; cin >> x; is_tourist[x] = true; } for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } dfs1(1, adj, 0, 0); dfs2(1, adj, 0); int ans = 1; int dis = 1e7; for (int i = 1; i <= n; i++) { int curr = f_sum[i] - max(f_max[i][0], f_max[i][1]); if (dis >= curr) dis = curr, ans = i; } cout << ans << endl; } int main() { int t; cin >> t; while (t--) { mainSolve(); } return 0; }