#include <stdio.h>
#define nmax 505
#define logmax 11
int M[nmax][nmax][logmax];
int N, T, m, i, j, k, l, p, ras;
int maxim(int i, int j, int l1, int l2)
{
int p, k, s, m;
if (l1 == 0 || l2 == 0 || i > N || j > N) return 0;
if (l1 == 1 && l2 == 1) return M[i][j][0];
for (p = 0, k = 1; k <= l1 && k <= l2; p++, k <<= 1);
k >>= 1; p--;
s = M[i][j][p];
m = maxim(i+k, j, l1-k, k);
if (m > s) s = m;
m = maxim(i, j+k, k, l2-k);
if (m > s) s = m;
m = maxim(i+k, j+k, l1-k, l2-k);
if (m > s) s = m;
return s;
}
int main(void)
{
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
scanf("%d%d", &N, &T);
// O(n*n)
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
scanf("%d", &M[i][j][0]);
// O(n*n*logn)
for (k = 2, l = 1, p = 1; k <= N; p++, k <<= 1, l <<= 1)
for (i = 1; i <= N-k+1; i++)
for (j = 1; j <= N-k+1; j++)
{
M[i][j][p] = M[i][j][p-1];
if (M[i+l][j][p-1] > M[i][j][p])
M[i][j][p] = M[i+l][j][p-1];
if (M[i][j+l][p-1] > M[i][j][p])
M[i][j][p] = M[i][j+l][p-1];
if (M[i+l][j+l][p-1] > M[i][j][p])
M[i][j][p] = M[i+l][j+l][p-1];
}
for (m = 1; m <= T; m++)
{
scanf("%d%d%d", &i, &j, &l);
for (p = 0, k = 1; k <= l; k<<=1, p++);
p--; k>>=1;
ras = M[i][j][p];
if (M[i+l-k][j][p] > ras)
ras = M[i+l-k][j][p];
if (M[i][j+l-k][p] > ras)
ras = M[i][j+l-k][p];
if (M[i+l-k][j+l-k][p] > ras)
ras = M[i+l-k][j+l-k][p];
printf("%d\n", ras);
}
return 0;
}