#include<bits/stdc++.h>
using namespace std;
#define MAXN 2000
int block_sz;
int depth[MAXN];
int parent[MAXN];
int jump_parent[MAXN];
int hmax;
///jump_parent is first ancestor
///of current node
vector <int> adj[MAXN];
void addEdge(int u,int v){
adj[u].push_back(v);
adj[v].push_back(u);
}
int lca_naive(int u,int v){
if(u==v){
return u;
}
if(depth[u]>depth[v])
swap(u,v);
v=parent[v];
return lca_naive(u,v);
}
void dfs(int cur,int prev){
depth[cur]=depth[prev]+1;
parent[cur]=prev;
//hmax=max(height,hmax);
///suppose if h=9,then sqrt(h)=3
///in that case total blocks will be
///0 to 3-1
/// so rem will be zero for only first element in the current block
if(depth[cur] % block_sz == 0){
jump_parent[cur]=parent[cur];
}
else{
jump_parent[cur]=jump_parent[prev];
}
for(int i=0;i<adj[cur].size();i++){
if(adj[cur][i]!=prev){
dfs(adj[cur][i],cur);
}
}
}
int lcasqrt(int u,int v){
while(jump_parent[u]!=jump_parent[v]){
if(depth[u]>depth[v])
swap(u,v);
v=jump_parent[v];
}
return lca_naive(u,v);
}
void preprocess(int height){
block_sz=sqrt(height);
depth[0]=-1;
dfs(1,0);
}
void dfs_height(int cur,int prev,int height){
hmax=max(height,hmax);
for(int i=0;i<adj[cur].size();i++){
if(adj[cur][i]!=prev)
dfs_height(adj[cur][i],cur,height+1);
}
}
int main(int argc, char const *argv[])
{
// adding edges to the tree
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int m;
cin>>m;
for(int j=1;j<=m;j++){
int v;
cin>>v;
adj[i].push_back(v);
}
}
dfs_height(1,0,0);
preprocess(hmax+1);
dfs(1,0);
int q;
cin>>q;
for(int i=0;i<q;i++){
int u,v;
cin>>u>>v;
cout<<lcasqrt(u,v)<<endl;
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBNQVhOIDIwMDAKaW50IGJsb2NrX3N6OwppbnQgZGVwdGhbTUFYTl07CmludCBwYXJlbnRbTUFYTl07CmludCBqdW1wX3BhcmVudFtNQVhOXTsKaW50IGhtYXg7Ci8vL2p1bXBfcGFyZW50IGlzIGZpcnN0IGFuY2VzdG9yCi8vL29mIGN1cnJlbnQgbm9kZQoKdmVjdG9yIDxpbnQ+IGFkaltNQVhOXTsKdm9pZCBhZGRFZGdlKGludCB1LGludCB2KXsKICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwp9CgppbnQgbGNhX25haXZlKGludCB1LGludCB2KXsKICAgIGlmKHU9PXYpewogICAgICAgIHJldHVybiB1OwogICAgfQogICAgaWYoZGVwdGhbdV0+ZGVwdGhbdl0pCiAgICAgICAgc3dhcCh1LHYpOwogICAgdj1wYXJlbnRbdl07CiAgICByZXR1cm4gbGNhX25haXZlKHUsdik7Cn0Kdm9pZCBkZnMoaW50IGN1cixpbnQgcHJldil7CiAgICBkZXB0aFtjdXJdPWRlcHRoW3ByZXZdKzE7CiAgICBwYXJlbnRbY3VyXT1wcmV2OwogICAgLy9obWF4PW1heChoZWlnaHQsaG1heCk7Ci8vL3N1cHBvc2UgaWYgaD05LHRoZW4gc3FydChoKT0zCi8vL2luIHRoYXQgY2FzZSB0b3RhbCBibG9ja3Mgd2lsbCBiZQovLy8wIHRvIDMtMQovLy8gc28gcmVtIHdpbGwgYmUgemVybyBmb3Igb25seSBmaXJzdCBlbGVtZW50IGluIHRoZSBjdXJyZW50IGJsb2NrCiAgICBpZihkZXB0aFtjdXJdICUgYmxvY2tfc3ogPT0gMCl7CiAgICAgICAganVtcF9wYXJlbnRbY3VyXT1wYXJlbnRbY3VyXTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAganVtcF9wYXJlbnRbY3VyXT1qdW1wX3BhcmVudFtwcmV2XTsKICAgIH0KICAgIGZvcihpbnQgaT0wO2k8YWRqW2N1cl0uc2l6ZSgpO2krKyl7CiAgICAgICAgaWYoYWRqW2N1cl1baV0hPXByZXYpewogICAgICAgICAgICBkZnMoYWRqW2N1cl1baV0sY3VyKTsKICAgICAgICB9CiAgICB9Cn0KaW50IGxjYXNxcnQoaW50IHUsaW50IHYpewogICAgd2hpbGUoanVtcF9wYXJlbnRbdV0hPWp1bXBfcGFyZW50W3ZdKXsKICAgICAgICBpZihkZXB0aFt1XT5kZXB0aFt2XSkKICAgICAgICAgICAgc3dhcCh1LHYpOwogICAgICAgIHY9anVtcF9wYXJlbnRbdl07CiAgICB9CiAgICByZXR1cm4gbGNhX25haXZlKHUsdik7Cn0Kdm9pZCBwcmVwcm9jZXNzKGludCBoZWlnaHQpewogICAgYmxvY2tfc3o9c3FydChoZWlnaHQpOwogICAgZGVwdGhbMF09LTE7CgogICAgZGZzKDEsMCk7Cn0Kdm9pZCBkZnNfaGVpZ2h0KGludCBjdXIsaW50IHByZXYsaW50IGhlaWdodCl7CiAgICBobWF4PW1heChoZWlnaHQsaG1heCk7CiAgICBmb3IoaW50IGk9MDtpPGFkaltjdXJdLnNpemUoKTtpKyspewogICAgICAgIGlmKGFkaltjdXJdW2ldIT1wcmV2KQogICAgICAgICAgICBkZnNfaGVpZ2h0KGFkaltjdXJdW2ldLGN1cixoZWlnaHQrMSk7CiAgICB9Cn0KaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKewogICAgLy8gYWRkaW5nIGVkZ2VzIHRvIHRoZSB0cmVlCiAgICBpbnQgdDsKICAgIGNpbj4+dDsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luPj5uOwogICAgICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKXsKICAgICAgICAgICAgaW50IG07CiAgICAgICAgICAgIGNpbj4+bTsKICAgICAgICAgICAgZm9yKGludCBqPTE7ajw9bTtqKyspewogICAgICAgICAgICAgICAgaW50IHY7CiAgICAgICAgICAgICAgICBjaW4+PnY7CgogICAgICAgICAgICAgICAgYWRqW2ldLnB1c2hfYmFjayh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZnNfaGVpZ2h0KDEsMCwwKTsKICAgICAgICBwcmVwcm9jZXNzKGhtYXgrMSk7CiAgICAgICAgZGZzKDEsMCk7CiAgICAgICAgaW50IHE7CiAgICAgICAgY2luPj5xOwogICAgICAgIGZvcihpbnQgaT0wO2k8cTtpKyspewogICAgICAgICAgICBpbnQgdSx2OwogICAgICAgICAgICBjaW4+PnU+PnY7CiAgICAgICAgICAgIGNvdXQ8PGxjYXNxcnQodSx2KTw8ZW5kbDsKCiAgICAgICAgfQoKCiAgICB9Cn0K