#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int N,Q, a[110][5050],aux[505000];
int modul(int x){
if (x<0)
x*=-1;
return x;
}
int min_mod(int x, int y){
int i=1,j=1,k=0,MIN=(1<<30);
while (i<=a[x][0] && j<=a[y][0]){
if (k)
MIN=min(MIN,modul(aux[k]-a[x][i]));
for (;a[x][i]<=a[y][j] && i<=a[x][0]; i++)
aux[++k]=a[x][i];
MIN=min(MIN,modul(aux[k]-a[y][j]));
for (;a[y][j]<=a[x][i] && j<=a[y][0]; j++)
aux[++k]=a[y][j];
}
if (i<=a[x][0])
MIN=min(MIN,modul(a[x][i]-aux[k]));
if (j<=a[y][0]);
MIN=min(MIN,modul(a[y][j]-aux[k]));
return MIN;
}
int valid(int val, int x, int y){
int i,j,cnt=0,sum=0;
for (i=x; i<=y; i++){
sum+=a[i][0];
for (j=1; j<=a[i][0]; j++)
if (a[i][j]<=val)
cnt++;
}
if (cnt<sum/2-1)
return -1;
else if (cnt>sum/2-1)
return 1;
else
return 0;
}
int med(int x, int y){
int l=-1000000000,r=1000000000,mid,i,j,k=0;
/*while (l<=r){
mid=(l+r)/2;
aux=valid(mid,x,y);
if (aux==-1)
l=mid+1;
else if (aux==1)
r=mid-1;
else
return mid;
}*/
for (i=x; i<=y; i++)
for (j=1; j<=a[i][0]; j++)
aux[++k]=a[i][j];
nth_element(aux+1,aux+(k/2),aux+k+1);
return aux[k/2];
}
int main(){
freopen("1-qvect.in","r",stdin);
freopen("qvect.out","w",stdout);
scanf("%d %d",&N,&Q);
int i,j,t,x,y;
for (i=1; i<=N; i++){
scanf("%d",&a[i][0]);
for (j=1; j<=a[i][0]; j++)
scanf("%d",&a[i][j]);
}
for (i=1; i<=Q; i++){
scanf("%d %d %d",&t,&x,&y);
if (t==1)
printf("%d\n",min_mod(x,y));
else
printf("%d\n",med(x,y));
}
return 0;
}