RT
#include<bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
#define int long long
const ll MAXN=1e6+5;
ll n,q,N,_;
ll a[MAXN],b[MAXN],b_sz;
ll lowbit(ll num){
return num&-num;
}
struct seg{
ll l,r,len,tp;
}s[MAXN];
ll reg_rk;
struct sgm_t{
ll rt[MAXN],lson[MAXN<<2],rson[MAXN<<2],sum[MAXN<<2],tot;
void push_up(ll id){
if(!id)return;
sum[id]=sum[lson[id]]+sum[rson[id]];
return;
}
void add(ll &id,ll L,ll R,ll k,ll delta){
if(!id)id=++tot;
if(L==R){
sum[id]+=delta;
return;
}
ll mid=(L+R)>>1;
if(k<=mid)add(lson[id],L,mid,k,delta);
else add(rson[id],mid+1,R,k,delta);
push_up(id);
return;
}
ll query(ll id1,ll id2,ll L,ll R,ll k){
if(L==R)return R;
ll res_sum=sum[lson[id1]]+sum[lson[id2]];
ll mid=(L+R)>>1;
if(res_sum>=k)return query(lson[id1],lson[id2],L,mid,k);
return query(rson[id1],rson[id2],mid+1,R,k-res_sum);
}
}S;
inline ll rd() {
ll s=0,m=0;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
_=rd();
while(_--){
n=rd(),q=rd();
N=0;
S.tot=0;
for(int i=1;i<=n;i++){
s[i].len=rd();
s[i].l=s[i-1].r+1;
s[i].r=s[i].l+s[i].len-1;
for(int j=s[i].l;j<=s[i].r;j++)a[j]=rd();
N+=s[i].len;
S.rt[i]=0;
}
for(int i=1;i<=N;i++)b[i]=a[i];
sort(b+1,b+1+N);
b_sz=unique(b+1,b+1+N)-b-1;
for(int i=1;i<=N;i++)a[i]=lower_bound(b+1,b+1+b_sz,a[i])-b;
// for(int i=1;i<=N;i++)cout<<a[i]<<' ';
// cout<<'\n';
// for(int i=1;i<=N;i++)cout<<b[a[i]]<<' ';
// cout<<'\n';
for(int i=1;i<=n;i++)for(int j=s[i].l;j<=s[i].r;j++)S.add(S.rt[i],1,b_sz,a[j],1);
for(int i=1,x=0,y=0;i<=q;i++){
x=rd(),y=rd();
reg_rk=s[x].len+s[y].len;
reg_rk=((reg_rk-1)>>1)+1;
// cout<<"rk: "<<reg_rk<<endl;
cout<<b[S.query(S.rt[x],S.rt[y],1,b_sz,reg_rk)]<<'\n';
// cout<<b[S.query(S.rt[x],S.rt[y],1,b_sz,s[x].len+s[y].len)]<<'\n';
}
}
return 0;
}