#include <iostream>
#include <cstdio>
using namespace std;
int mat[501][501];
int maxim[501][501][12];
int plantatieMax(int x, int y, int l);
int alegeMaxim(int a, int b, int c, int d);
void inter(int &a, int &b);
int main()
{
FILE *fin = fopen("plantatie.in", "r");
FILE *fout = fopen("plantatie.out", "w");
int n, t, x, y, lat, rez, col1, col2;
fscanf(fin, "%d%d", &n, &t);
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= n; ++j){
fscanf(fin, "%d", &mat[i][j]);
maxim[i][j][0] = mat[i][j];
}
}
for(int i = n; i >= 1; --i){
//fprintf(fout, "\n%d\n", i);
for(int j = n; j >= 1; --j){
//fprintf(fout, "%d: ", j);
for(int k = 1; j + (1 << (k - 1)) <= n && i + (1 << (k - 1)) <= n; ++k){
maxim[i][j][k] = alegeMaxim(maxim[i][j][k - 1], maxim[i][j + (1 << (k - 1))][k - 1],
maxim[i + (1 << (k - 1))][j][k - 1], maxim[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]);
//fprintf(fout, "%d ", maxim[i][j][k]);
}
//fprintf(fout, "\n");
}
}
while(t--){
fscanf(fin, "%d%d%d", &x, &y, &lat);
fprintf(fout, "%d\n", plantatieMax(x, y, lat));
}
return 0;
}
int alegeMaxim(int a, int b, int c, int d){
if(a < b)
inter(a, b);
if(c < d)
inter(c, d);
if(a < c)
inter(a, c);
return a;
}
int plantatieMax(int x, int y, int l){
int k = 0;
while((1 << k) < l)
++k;
if((1 <<k) == l)
return maxim[x][y][k];
--k;
return alegeMaxim(maxim[x][y][k], maxim[x][y + l - (1 << k)][k],
maxim[x + l - (1 << k)][y][k], maxim[x + l - (1 << k)][y + l - (1 << k)][k]);
}
void inter(int &a, int &b){
int aux = a;
a = b;
b = aux;
}