#include <bits/stdc++.h>
using namespace std;
FILE *fin = fopen ("plantatie.in", "r"), *fout = fopen ("plantatie.out", "w");
const int MAXN = 512;
int d[MAXN + 1][MAXN + 1][10];
void compute () {
int k, i, j;
for (k = 1; k <= 9; k++)
for (i = 1; i + (1 << k) <= MAXN; i++)
for (j = 1; j + (1 << k) <= MAXN; j++)
d[i][j][k] = max (d[i][j][k - 1],
max (d[i + (1 << k) / 2][j][k - 1],
max (d[i][j + (1 << k) / 2][k - 1],
d[i + (1 << k) / 2][j + (1 << k) / 2][k - 1])));
}
int ow (int k) {
int sol = 1;
while (sol * 2 <= k)
sol = sol * 2;
return sol;
}
int lg (int n) {
int sol = 0;
while (n > 1) {
sol++;
n = n / 2;
}
return sol;
}
int solve (int x, int y, int k) {
int tolg = ow (k);
return max (d[x][y][lg (tolg)], max (d[x + k - tolg][y][lg (tolg)], max (d[x][y + k - tolg][lg (tolg)], d[x + k - tolg][y + k - tolg][lg (tolg)])));
}
int main() {
int n, m, i, j, x, y, k;
fscanf (fin, "%d%d", &n, &m);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
fscanf (fin, "%d", &d[i][j][0]);
compute ();
// d[1][1][9] = compute (1, 1, 9);
//fprintf (fout, "%d\n", d[1][1][3]);
while (m--) {
fscanf (fin, "%d%d%d", &x, &y, &k);
fprintf (fout, "%d\n", solve (x, y, k));
}
fclose (fin);
fclose (fout);
return 0;
}