#include<bits/stdc++.h>
using namespace std;
const int N=1000010,M=1010;
inline long long read()
{
long long x=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x;
}
inline void write(long long x)
{
if(x>9)
write(x/10);
putchar(x%10+'0');
}
inline void swap(int &x,int &y)
{
x^=y^=x^=y;
}
int T,n,m;
long long a[N],ls[N];
int len,idx;
int l[N],r[N],size[N];
int v[N],cnt[M],fa[N];
int sq;
inline void add(int x)
{
v[x]++;
cnt[fa[x]]++;
}
inline void del(int x)
{
v[x]--;
cnt[fa[x]]--;
}
int kk;
int lk[M],rk[M];
void build(int ll,int rr)
{
kk++;
lk[kk]=ll,rk[kk]=rr;
for(int i=ll;i<=rr;i++)
fa[i]=kk;
if(rr==len)
return ;
build(ll+sq,min(rr+sq,len));
}
struct Q{
int idx,x,y,maxx;
}q[N];
inline bool cmp(Q a1,Q a2)
{
return a1.maxx>a2.maxx;
}
long long ans[N];
bool pd[3][3];
inline void pan(int i)
{
q[i-1].x==q[i].x?pd[1][1]=1:1;
q[i-1].x==q[i].y?pd[1][2]=1:1;
q[i-1].y==q[i].x?pd[2][1]=1:1;
q[i-1].y==q[i].y?pd[2][2]=1:1;
}
inline void qing()
{
pd[1][1]=0;
pd[1][2]=0;
pd[2][1]=0;
pd[2][2]=0;
}
int x;
void change(int i)
{
if(!pd[1][1]&&!pd[1][2])
{
x=q[i-1].x;
for(int j=l[x];j<=r[x];j++)
del(a[j]);
}
if(!pd[2][1]&&!pd[2][2])
{
x=q[i-1].y;
for(int j=l[x];j<=r[x];j++)
del(a[j]);
}
if(!pd[1][1]&&!pd[2][1])
{
x=q[i].x;
for(int j=l[x];j<=r[x];j++)
add(a[j]);
}
if(!pd[1][2]&&!pd[2][2])
{
x=q[i].y;
for(int j=l[x];j<=r[x];j++)
add(a[j]);
}
}
int t,b;
void ask(int idx)
{
for(int i=1;i<=kk;i++)
{
if(t>cnt[i])
{
t-=cnt[i];
}
else
{
b=i;
break;
}
}
for(int i=lk[b];i<=rk[b];i++)
{
if(t>v[i])
t-=v[i];
else
{
ans[idx]=ls[i];
return ;
}
}
}
int main()
{
r[0]=-1;
T=read();
while(T--)
{
n=read(),m=read();
len=0;
for(int i=1;i<=n;i++)
{
l[i]=r[i-1]+1;
r[i]=read();
size[i]=r[i];
r[i]+=r[i-1];
for(int j=l[i];j<=r[i];j++)
a[j]=read(),ls[++len]=a[j];
}
idx=len;
sort(ls+1,ls+idx+1);
idx=unique(ls+1,ls+idx+1)-ls-1;
for(int i=1;i<=len;i++)
a[i]=lower_bound(ls+1,ls+idx+1,a[i])-ls;
for(int i=1;i<=m;i++)
{
q[i].idx=i;
q[i].x=read(),q[i].y=read();
if(size[q[i].x]<size[q[i].y])
swap(q[i].x,q[i].y);
q[i].maxx=size[q[i].x];
}
sort(q+1,q+m+1,cmp);
sq=sqrt(idx);
build(1,sq);
for(int i=1;i<=m;i++)
{
pan(i);
change(i);
t=size[q[i].x]+size[q[i].y];
t=ceil(t*1.0/2);
ask(q[i].idx);
qing();
}
for(int i=1;i<=m;i++)
write(ans[i]),putchar(10);
x=q[m].x;
for(int i=l[x];i<=r[x];i++)
del(a[i]);
x=q[m].y;
for(int i=l[x];i<=r[x];i++)
del(a[i]);
}
return 0;
}
记录