#include <iostream>
using namespace std;
#define NMAX 501
#define NMAXX 2004
long I,J,Q,maxx,maxy,q,w,a,b,i,j,n,m,v[NMAX],t[NMAXX][NMAX];
void build(long k, long beg, long end,long p){
if (beg==end){
t[p][k]=v[beg];
return;
}
build(2*k,beg,(beg+end)/2,p);
build(2*k+1,(beg+end)/2+1,end,p);
if (t[p][k*2]>=t[p][k*2+1])
t[p][k]=t[p][k*2];
else
t[p][k]=t[p][k*2+1];
}
int maxq (long k, long beg, long end, long p){
if (a>end || b<beg){
return -1;
}
if (a<=beg && end<=b){
return t[p][k];
}
long x=maxq(2*k,beg,(beg+end)/2,p);
long y=maxq(2*k+1,(beg+end)/2+1,end,p);
if (x>=y)
return x;
else
return y;
}
int main(){
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w", stdout);
scanf("%ld %ld",&n,&m);
for (j=1; j<=n; j++){
for (i=1; i<=n; i++){
scanf("%ld ", &v[i]);
}
build(1,1,n,j);
}
for (w=1; w<=m; w++){
scanf ("%ld %ld %ld" ,&I,&J,&Q);
maxx=-1;
a=J;
b=J+Q-1;
for (i=1; i<=Q; i++){
maxy=maxq(1,1,n,I+i-1);
if (maxy>maxx) maxx=maxy;
}
printf("%ld\n", maxx);
}
return 0;
}