#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, x[2001][2001], y[501][501];
void B(int nod, int st, int dr, int p, int p1)
{if(st==dr)
x[p][nod]=y[p1][st];
else
{int mij=(st+dr)/2;
B(nod*2, st, mij, p, p1);
B(nod*2+1, mij+1, dr, p, p1);
x[p][nod]=max(x[p][nod*2], x[p][nod*2+1]);
}
}
void C(int nod)
{for(int i=1;i<=n*4;i++)
x[nod][i]=max(x[nod*2][i], x[nod*2+1][i]);
}
void Build(int nod, int st, int dr)
{if(st==dr)
B(1, 1, n, nod, st);
else
{int mij=(st+dr)/2;
Build(nod*2, st, mij);
Build(nod*2+1, mij+1, dr);
C(nod);
}
}
int Q(int nod, int st, int dr, int qs, int qd, int p)
{if(st>=qs && dr<=qd)
return x[p][nod];
else
{int mij=(st+dr)/2;
if(mij>=qd)return Q(nod*2, st, mij, qs, qd, p);
if(mij<qs)return Q(nod*2+1, mij+1, dr, qs, qd, p);
int a1=Q(nod*2, st, mij, qs, qd, p), b1=Q(nod*2+1, mij+1, dr, qs, qd, p);
return max(a1, b1);
}
}
int Query(int nod, int st, int dr, int a, int b, int c, int d)
{if(st>=a && c>=dr)
return Q(1, 1, n, b, d, nod);
else
{int mij=(st+dr)/2;
if(mij>=c)return Query(nod*2, st, mij, a, b, c, d);
if(mij<a)return Query(nod*2+1, mij+1, dr, a, b, c, d);
int a1=Query(nod*2, st, mij, a, b, c, d), b1=Query(nod*2+1, mij+1, dr, a, b, c, d);
return max(a1, b1);
}
}
int main()
{ int m, a, b, c;
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>y[i][j];
Build(1, 1, n);
for(int i=1;i<=m;i++)
{fin>>a>>b>>c;
fout<<Query(1, 1, n, a, b, a+c-1, b+c-1)<<"\n";
}
return 0;
}