#include <cstdio>
using namespace std;
FILE *f, *g;
int n, q;
int rmq[502][502][10];
char s[6099];
int crChar;
int p2Max[502];
bool isDigit(char c)
{
if(c >= '0' && c <= '9')
return 1;
return 0;
}
int getNr()
{
int nr = 0;
while(isDigit(s[crChar]))
{
nr = nr * 10 + s[crChar] - '0';
crChar ++;
}
crChar ++;
return nr;
}
void readFile()
{
f = fopen("plantatie.in", "r");
fscanf(f, "%d%d\n", &n, &q);
int i, j;
for(i = 1; i <= n; i ++)
{
fgets(s, 6000, f);
crChar = 0;
for(j = 1; j <= n; j ++)
rmq[i][j][0] = getNr();
}
}
void getP2Max()
{
int i;
p2Max[1] = 0;
for(i = 2; i <= n; i ++)
p2Max[i] = p2Max[i / 2] + 1;
}
inline int mxa(int a, int b)
{
return (a > b ? a : b);
}
int mxa3(int a, int b, int c)
{
if(a < b)
return mxa(b, c);
return mxa(a, c);
}
int mxa4(int a, int b, int c, int d)
{
if(a < b)
return mxa3(b, c, d);
return mxa3(a, c, d);
}
void getRMQ()
{
int j, i, h, p2;
for(j = 1; (1 << j) <= n; j ++)
{
p2 = 1 << (j - 1);
for(i = 1; i <= n - (1 << j) + 1; i ++)
{
for(h = 1; h <= n - (1 << j) + 1; h ++)
{
rmq[i][h][j] = mxa4(rmq[i][h][j - 1],
rmq[i][h + p2][j - 1],
rmq[i + p2][h][j - 1],
rmq[i + p2][h + p2][j - 1]
);
}
}
}
}
void solve()
{
getP2Max();
getRMQ();
}
int poz(int a)
{
if(a < 0)
return (- a);
return a;
}
void answerQuestions()
{
g = fopen("plantatie.out", "w");
int i, l, c, k, p2, difl, difc;
for(i = 1; i <= q; i ++)
{
fscanf(f, "%d%d%d", &l, &c, &k);
p2 = p2Max[k];
difl = k - (1 << p2);
difc = k - (1 << p2);
fprintf(g, "%d\n", mxa4(rmq[l][c][p2],
rmq[l + difl][c][p2],
rmq[l][c + difc][p2],
rmq[l + difl][c + difc][p2]));
}
}
int main()
{
readFile();
solve();
answerQuestions();
return 0;
}