#include <stdio.h>
#include <vector>
using namespace std;
const int N=1e5+10;

#define PB push_back
int max(int a,int b){return a>b?a:b;}

int hev[N],top[N],dep[N],p[N];
vector<int>des[N];
int init(int now){
    if(des[now].empty())return 0;
    int ans=0,temp;
    for(int i=0;i<des[now].size();i++){
        dep[des[now][i]]=dep[now]+1;
        p[des[now][i]]=now;
        temp=init(des[now][i])+1;
        if(temp>ans){
            ans=temp;
            hev[now]=i;
        }
    }
    return ans;
}
void built(int now,int from){
    top[now]=from;
    for(int i=0;i<des[now].size();i++){
        if(hev[now]==i)built(des[now][i],from);
        else built(des[now][i],des[now][i]);
    }
    return ;
}
int lca(int a,int b){
    while(a!=b){
        if(dep[top[a]]>dep[top[b]])swap(a,b);
        if(top[a]==top[b]){
            if(dep[b]<dep[a])a=b;
            break;
        }
        b=p[top[b]];
    }
    return a;
}
int main(){
    int n,k,l,r;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&k);
        while(k--){
            scanf("%d",&l);
            des[i].PB(l);
        }
    }
    init(0);
    built(0,0);
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&l,&r);
        printf("%d\n",lca(l,r));
    }
}
