#include <stdio.h>
#include <assert.h>
#define MAX_N 512
#define MAX_LG 10
#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define max(a, b) ((a) > (b) ? (a) : (b))
int N, M, A[MAX_N][MAX_N], rmq[MAX_LG][MAX_N][MAX_N], lg[MAX_N];
char buf[1<<16], *ptr;
inline int get(void)
{
int n;
for (n = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
n = n*10 + *ptr-'0';
for (; *ptr == ' '; ptr++);
return n;
}
int main(void)
{
int i, j, t, p, inc, ret;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d\n", &N, &M);
assert(1 <= N && N <= 500);
assert(1 <= M && M <= 75000);
FOR (i, 1, N+1)
{
fgets(buf, sizeof(buf), stdin);
ptr = buf;
FOR (j, 1, N+1) A[i][j] = get();
FOR (j, 1, N+1) assert(0 <= A[i][j] && A[i][j] <= 1000000000);
}
FOR (i, 1, N+1) FOR (j, 1, N+1) rmq[0][i][j] = A[i][j];
for (t = 0; (1<<t) <= N; t++)
{
inc = (1<<t);
FOR (i, 1, N+1) FOR (j, 1, N+1)
{
rmq[t+1][i][j] = rmq[t][i][j];
if (i+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i+inc][j]);
if (j+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i][j+inc]);
if (i+inc <= N && j+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i+inc][j+inc]);
}
}
for (i = 2, j = 1; i <= N; i++)
{
lg[i] = j;
if ((1<<(j+1)) == i+1) j++;
}
for (; M > 0; M--)
{
scanf("%d %d %d", &i, &j, &inc);
t = lg[inc]; p = 1<<t;
ret = rmq[t][i][j];
if (j+inc >= p) ret = max(ret, rmq[t][i][j+inc-p]);
if (i+inc >= p) ret = max(ret, rmq[t][i+inc-p][j]);
if (i+inc >= p && j+inc >= p) ret = max(ret, rmq[t][i+inc-p][j+inc-p]);
printf("%d\n", ret);
}
return 0;
}