#include <fstream>
#include <iostream>
#include <math.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
const int MAX_N = 505;
int n, m;
int rmq[10][MAX_N][MAX_N];
int bin[MAX_N];
void BuildExp() {
bin[1] = 0;
for (int i = 2; i <= n; i++) {
bin[i] = bin[i / 2] + 1;
}
}
void BuildRMQ() {
for (int e = 1; e < 10; e++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int lf = i + (1 << (e - 1));
int rg = j + (1 << (e - 1));
rmq[e][i][j] = rmq[e - 1][i][j];
if (lf <= n) {
rmq[e][i][j] = max(rmq[e][i][j], rmq[e - 1][lf][j]);
}
if (rg <= n) {
rmq[e][i][j] = max(rmq[e][i][j], rmq[e - 1][i][rg]);
}
if (lf <= n && rg <= n) {
rmq[e][i][j] = max(rmq[e][i][j], rmq[e - 1][lf][rg]);
}
}
}
}
}
int QueryRMQ(int lf, int rg, int l) {
int len = bin[l];
int newLf = lf + l - (1 << len);
int newRg = rg + l - (1 << len);
int answer = max(rmq[len][lf][rg], rmq[len][newLf][newRg]);
answer = max(answer, rmq[len][newLf][rg]);
answer = max(answer, rmq[len][lf][newRg]);
return answer;
}
void BuildAnswer() {
for (int i = 1; i <= m; i++) {
int lf, rg, len;
fin >> lf >> rg >> len;
fout << QueryRMQ(lf, rg, len) << '\n';
}
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
fin >> rmq[0][i][j];
}
}
BuildExp();
BuildRMQ();
BuildAnswer();
return 0;
}