#include <fstream>
#include <math.h>
#include <iostream>
using namespace std;
int rmq[10][500][500];
int plant[500][500];
int n;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
int maxim(int a, int b, int c, int d){
if((a > b) && (a > c) && (a > d)){
return a;
}
if((b > c) && (b > d)){
return b;
}
if(c > d){
return c;
}
return d;
}
void readPlantatie(){
int x;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
in>>x;
plant[i][j] = x;
rmq[0][i][j] = x;
}
}
}
void populateRmq(){
for(int i = 1; i <= int(log2(n)); i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
int offset = pow(2, i - 1);
rmq[i][j][k] = maxim(rmq[i - 1][j][k], rmq[i - 1][j + offset][k], rmq[i - 1][j][k + offset], rmq[i - 1][j + offset][k + offset]);
}
}
}
}
int interogate(int i, int j, int l){
if(int(log2(l)) == log2(l)){
return rmq[int(log2(l))][i][j];
}
int power = int(log2(l));
int lowest2pow = pow(2, power);
return maxim(rmq[power][i][j], rmq[power][i + l - lowest2pow][j], rmq[power][i][j + l - lowest2pow], rmq[power][i + l - lowest2pow][j + l - lowest2pow]);
}
int main(){
int m, x, y, l;
in>>n>>m;
readPlantatie();
populateRmq();
for(int i = 0; i < m; i++){
in>>x>>y>>l;
out<<interogate(x - 1, y - 1, l)<<endl;
}
in.close();
out.close();
}