#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,siz[1000010],pos,t;
inline int read(){
char ch=getchar();
int x=0;
while(ch<'0'||'9'<ch)ch=getchar();
while('0'<=ch&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x;
}
vector<int>v[1000010];
bool check(int p,int x,int y){
int s1=upper_bound(v[x].begin(),v[x].begin()+siz[x],p)-v[x].begin();
int s2=upper_bound(v[y].begin(),v[y].begin()+siz[y],p)-v[y].begin();
return s1+s2>=pos;
}
signed main(){
t=read();
while(t--){
n=read(),q=read();
for(int i(1);i<=n;++i){
siz[i]=read();
for(int j(1);j<=siz[i];++j){
int x;
x=read();
v[i].push_back(x);
}
sort(v[i].begin(),v[i].begin()+siz[i]);
}
while(q--){
int x,y;
x=read(),y=read();
pos=(siz[x]+siz[y]);
if(pos&1)pos=pos/2+1;
else pos=pos/2;
int l=min(v[x][max(0ll,siz[x]-pos-1)],v[y][max(0ll,siz[y]-pos-1)]),r=max(v[x][min(siz[x]-1,pos+1)],v[y][min(siz[y]-1,pos+1)]),ans;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid,x,y))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%lld\n",ans);
}
}
return 0;
}