#include <cstdio>
#include <fstream>
using namespace std;
const char iname[] = "plantatie.in";
const char oname[] = "plantatie.out";
#define MAX_N 505
#define MAX_LG 10
int A[MAX_N][MAX_N][MAX_LG];
int N, M;
int main(void)
{
ifstream fin(iname);
ofstream fout(oname);
fin >> N >> M;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
fin >> A[i][j][0];
}
}
// Pre-compute values using a different method
for (int k = 1; k <= MAX_LG; ++k)
{
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
int add = 1 << (k - 1);
if ((i + add > N) || (j + add > N))
continue;
int ret = 0;
for (int x = i; x <= i + add; ++x)
{
for (int y = j; y <= j + add; ++y)
{
ret = max(ret, A[x][y][k - 1]);
}
}
A[i][j][k] = ret;
}
}
}
int P[MAX_N] = {0};
for (int i = 0; (1 << i) <= N; ++i)
P[1 << i] = i;
for (int i = 3; i <= N; ++i)
{
if (P[i] == 0)
P[i] = P[i - 1];
}
for (int m = 0; m < M; ++m)
{
int i, j, k;
fin >> i >> j >> k;
int r = P[k];
int ret = 0;
for (int x = i; x <= i + k - (1 << r); ++x)
{
for (int y = j; y <= j + k - (1 << r); ++y)
{
ret = max(ret, A[x][y][r]);
}
}
fout << ret << "\n";
}
fin.close();
fout.close();
return 0;
}