#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int rmq[505][505][12];
int N,M;
int lg[5050];
int get(int x,int y,int k){
if(x > N || y > N)
return 0;
return rmq[x][y][k];
}
int main(){
freopen("plantatie.in","r",stdin);
freopen("plantatie.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;++i){
for(int j=1;j<=N;++j){
scanf("%d",&rmq[i][j][0]);
}
}
lg[0]=0;
for(int i=1;i<=500;++i){
lg[i] = lg[i/2] + 1;
}
for(int k=1;k<=10;++k){
for(int i=1;i<=N;++i){
for(int j=1;j<=N;++j){
int loc = (1<<(k-1));
rmq[i][j][k] = max(max(get(i,j,k-1),get(i+loc,j,k-1)),max(get(i,j+loc,k-1),get(i+loc,j+loc,k-1)));
}
}
}
for(int i=1;i<=M;++i){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
int sz = lg[k]-1;
int loc = k-(1<<sz);
//printf("%d %d %d %d\n",x,y,loc,sz);
int ret = max(max(get(x,y,sz),get(x+loc,y,sz)),max(get(x,y+loc,sz),get(x+loc,y+loc,sz)));
printf("%d\n",ret);
}
return 0;
}