#include <stdio.h>
#include <string.h>
#define NMAX 512
#define KMAX 10
#define SMAX 5002
FILE *f = fopen("plantatie.in","rt"), *g = fopen("plantatie.out","wt");
long int a[NMAX][NMAX],i,j,k,n,m[NMAX][NMAX][KMAX],l,lmax,x,y,nr;
long int MINN(long int a, long int b)
{
if (a<b) return a;
return b;
}
long int MAXX(long int a, long int b)
{
if (a>b) return a;
return b;
}
void citire()
{
char c[SMAX];
fscanf(f,"%ld %ld\n",&n,&nr);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
fscanf(f,"%ld",&a[i][j]);
}
long int query(long int x, long int y, long int l)
{
long int k,i,j,rez,sh;
i=x;j=y;
k=1;
while ( (1 << k) <= l)
k++;
k--;
rez=m[i][j][k];
sh=l- (1 << k);
rez=MAXX(m[i+sh][j][k],rez);
rez=MAXX(m[i][j+sh][k],rez);
rez=MAXX(m[i+sh][j+sh][k],rez);
return rez;
}
void build()
{
for (i=n;i>=1;i--)
for (j=n;j>=1;j--)
{
m[i][j][0]=a[i][j];
k=1;
lmax=MINN(n-i+1,n-j+1);
while ( (1 << k) <=lmax)
{
l=1 << k;
x=query(i+1,j,l-1);
y=query(i,j+1,l-1);
x=MAXX(x,y);
x=MAXX(x,a[i][j]);
x=MAXX(x,a[i+l-1][j+l-1]);
m[i][j][k]=x;
k++;
}
}
}
int main()
{
long int cnt,sol,x,y,l;
citire();
build();
for (cnt=1;cnt<=nr;cnt++)
{
fscanf(f,"%ld %ld %ld",&x,&y,&l);
sol=query(x,y,l);
fprintf(g,"%ld\n",sol);
}
fclose(f);
fclose(g);
return 0;
}