#include<stdio.h>
#define MAXN 505
FILE *f=fopen("plantatie.in","r"), *g=fopen("plantatie.out","w");
int N, logN, Q, RMQ[10][MAXN][MAXN], log[MAXN], doi[10];
int Max2( int A, int B ){ if(A>B) return A; return B; }
int Max( int A, int B, int C, int D ){ return Max2( Max2(A,B), Max2(C,D) ); }
void Citire(){
int i, j;
fscanf(f,"%d %d\n",&N,&Q);
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
fscanf(f,"%d",&RMQ[0][i][j]);
for(i=2;i<=MAXN-1;i++)
log[i] = log[i/2] + 1;
doi[0] = 1;
for(i=1;i<=9;i++)
doi[i] = doi[i-1] * 2;
logN = log[N];
}
void CreareRMQ(){
int k, i, j, l;
for(k=1;k<=logN;k++){
l=doi[k];
for(i=1;i<=N-l+1;i++)
for(j=1;j<=N-l+1;j++)
RMQ[k][i][j] = Max( RMQ[k-1][ i ] [ j ],
RMQ[k-1][ i+(l/2) ][ j ],
RMQ[k-1][ i ] [ j+(l/2) ],
RMQ[k-1][ i+(l/2) ][ j+(l/2) ] );
}
}
void Rezolvare(){
int q, x, y, L, logL, doiL;
for(q=1;q<=Q;q++){
fscanf(f,"%d %d %d\n",&x,&y,&L);
logL = log[L];
doiL = doi[logL];
fprintf(g,"%d\n", Max( RMQ[logL][x][y],
RMQ[logL][x+L-doiL][y],
RMQ[logL][x][y+L-doiL],
RMQ[logL][x+L-doiL][y+L-doiL] ) );
}
}
int main(){
Citire();
CreareRMQ();
Rezolvare();
return 0;
}