#include <stdio.h>
#include <vector>
using namespace std;
#define INF 2000000000
#define nm 510
int v[nm][nm];
//int s[nm][nm][nm];
vector <int> s;
int n, m, i, j, x, y, l;
int tx[nm][nm*3], ty[nm][nm*3];
inline int MIN(int a, int b)
{
return (a < b ? a : b);
}
inline int MAX(int a, int b)
{
return (a > b ? a : b);
}
void read()
{
scanf("%d %d", &n, &m);
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
scanf("%d ", &v[i][j]);
}
}
void buildtx(int a, int b, int p, int l)
{
if (a >= b)
{
tx[l][p] = v[l][a];
// txmin[p] = v[l][a];
}
else
{
buildtx(a, (a+b)/2, 2*p, l);
buildtx((a+b)/2+1, b, 2*p+1, l);
tx[l][p] = MAX(tx[l][2*p], tx[l][2*p+1]);
// tmin[p] = MIN(tmin[2*p], tmin[2*p+1]);
}
}
void buildty(int a, int b, int p, int col)
{
if (a >= b)
{
ty[col][p] = v[a][col];
// txmin[p] = v[l][a];
}
else
{
buildty(a, (a+b)/2, 2*p, col);
buildty((a+b)/2+1, b, 2*p+1, col);
ty[col][p] = MAX(ty[col][2*p], ty[col][2*p+1]);
// tmin[p] = MIN(tmin[2*p], tmin[2*p+1]);
}
}
void researchx(int a, int b, int &x, int p, int A, int B, int l)
{
if (a == A && b == B)
{
// x = MIN(x, tmin[p]);
x = MAX(x, tx[l][p]);
}
else
if (b <= (A+B) / 2)
{
researchx(a, b, x, 2*p, A, (A+B)/2, l);
}
else
if (a > (A+B)/2)
{
researchx(a, b, x, 2*p+1, (A+B)/2+1, B, l);
}
else
{
researchx(a, (A+B)/2, x, 2*p, A, (A+B)/2, l);
researchx((A+B)/2+1, b, x, 2*p+1, (A+B)/2+1, B, l);
}
}
void researchy(int a, int b, int &x, int p, int A, int B, int l)
{
if (a == A && b == B)
{
// x = MIN(x, tmin[p]);
x = MAX(x, ty[l][p]);
}
else
if (b <= (A+B) / 2)
{
researchy(a, b, x, 2*p, A, (A+B)/2, l);
}
else
if (a > (A+B)/2)
{
researchy(a, b, x, 2*p+1, (A+B)/2+1, B, l);
}
else
{
researchy(a, (A+B)/2, x, 2*p, A, (A+B)/2, l);
researchy((A+B)/2+1, b, x, 2*p+1, (A+B)/2+1, B, l);
}
}
int mintx(int i, int i1, int j)
{
int x = 0;
researchx(i, i1, x, 1, 1, n, j);
return x;
}
int minty(int i, int i1, int j)
{
int x = 0;
researchy(i, i1, x, 1, 1, n, j);
return x;
}
void solve()
{
for (i=1; i<=n; i++)
{
buildtx(1, n, 1, i);
buildty(1, n, 1, i);
}
/* for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
for (l=0; l<(MIN(n-i+1, n-j+1)); l++)
{
if (l == 0)
{
s[i][j].push_back(v[i][j]);
}
else
{
s[i][j].push_back( MAX(s[i][j][l-1], minty(i, i + l, j + l)) );
// s[i][j][l] = MAX(s[i][j][l-1], minty(i, i + l - 1, j + l - 1));
// s[i][j][l] = MAX(s[i][j][l], mintx(j, j + l - 1, i + l - 1));
s[i][j][l] = MAX(s[i][j][l], mintx(j, j + l, i + l));
}
}
}*/
}
void write()
{
for (i=1; i<=m; i++)
{
scanf("%d %d %d", &x, &y, &l);
s.clear();
for (j=0; j<l; j++)
{
if (j == 0)
{
s.push_back(v[x][y]);
}
else
{
s.push_back(MAX(s[j-1], minty(x, x + j, y + j)));
s[j] = MAX(s[j], mintx(y, y + j, x + j));
}
}
printf("%d\n", s[l-1]);
}
}
int main()
{
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out","w",stdout);
read();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}