#include<iostream>#include<cstring>#include<vector>#include<algorithm>usingnamespace std;constint N =1e5+10;int n, m;
vector<int> G[N];int dep[N], id[N], fa[N], tot;int up[N][21];int s1[N], s2[N];voiddfs(int from,int x){
id[x]= tot ++;
fa[x]= from;
dep[x]= dep[from]+1;for(int i =0; i <(int)G[x].size(); i ++)if(from != G[x][i])dfs(x, G[x][i]);return;}voidinit(){for(int i =1; i <= n; i ++)// 先跳0层
up[i][0]= fa[i];for(int k =1; k <=20; k ++)// [1, 20]for(int i =1; i <= n; i ++)
up[i][k]= up[up[i][k -1]][k -1];return;}boolcmp(int u,int v){return id[u]< id[v];}intlca(int a,int b){if(dep[a]< dep[b])swap(a, b);for(int k =20; k >=0; k --)// [20, 1]if(dep[up[a][k]]>= dep[b])
a = up[a][k];if(a == b)return a;for(int k =20; k >=0; k --)// [20, 1]if(up[a][k]!= up[b][k]){
a = up[a][k];
b = up[b][k];}return up[a][0];}intmain(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while(cin >> n >> m){for(int i =1; i <= n; i ++) G[i].clear();// 清空
tot =0;// 清空for(int i =0; i < n -1; i ++){int u, v;
cin >> u >> v;
G[u].push_back(v), G[v].push_back(u);}dfs(0,1);// dfs序,深度,父节点init();// 发展up数组while(m --){int k1, k2;
cin >> k1;for(int i =0; i < k1; i ++) cin >> s1[i];
cin >> k2;for(int i =0; i < k2; i ++) cin >> s2[i];sort(s1, s1 + k1, cmp);// 按dfs序排序sort(s2, s2 + k2, cmp);int i =0, j =0, ans =0;while(i < k1 && j < k2){
ans =max(ans, dep[lca(s1[i], s2[j])]);// 注意的深度depif(id[s1[i]]> id[s2[j]]) j ++;else i ++;// 如果第一个集合的点的dfs序大于第二个中的dfs序,则选第二个中的dfs序更大}
cout << ans << endl;}}return0;}