#include <iostream>
#include <vector>
#include <set>
unsigned map[2048][2048];
std::size_t blk[2048][2048];
struct Seg{
	std::size_t begin, end;
};
bool operator<(const Seg &a, const Seg &b){
	if(a.begin!=b.begin) return a.begin<b.begin;
	return a.end<b.end;
}
std::size_t n;
std::vector<Seg> diags[2][4096];
std::pair<std::size_t, std::size_t> diag(std::size_t i, std::size_t j){
	return std::make_pair(n+i-j, i);
}
std::pair<std::size_t, std::size_t> undiag(std::size_t i, std::size_t j){
	return std::make_pair(j, n+j-i);
}
int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cin>>n;
	for(std::size_t i=0;i<n;i++){
		for(std::size_t j=0;j<n;j++){
			std::cin>>map[i][j];
		}
	}
	for(std::size_t i=1;i<n;i++){
		std::size_t last=n;
		for(std::size_t j=n-1;j;j--){
			if(map[i][j]==map[i-1][j]) last=j;
			blk[i][j]=last-j;
		}
	}
	for(std::size_t j=1;j<n;j++){
		std::size_t last=n;
		for(std::size_t i=n-1;i;i--){
			if(map[i][j]==map[i][j-1]) last=i;
			std::size_t b=std::min(blk[i][j], last-i);
			if(b==0) continue;
			Seg s;
			std::pair<std::size_t, std::size_t> c=diag(i, j);
			s.begin=c.second;
			s.end=c.second+b;
			diags[0][c.first].push_back(s);
		}
	}
	for(std::size_t i=1;i<n;i++){
		std::size_t last=1;
		for(std::size_t j=1;j<n;j++){
			blk[i][j]=j-last;
			if(map[i][j]==map[i-1][j]) last=j+1;
		}
	}
	for(std::size_t j=1;j<n;j++){
		std::size_t last=1;
		for(std::size_t i=1;i<n;i++){
			std::size_t b=std::min(blk[i][j], i-last);
			if(map[i][j]==map[i][j-1]) last=i+1;
			if(b==0) continue;
			Seg s;
			std::pair<std::size_t, std::size_t> c=diag(i, j);
			s.begin=c.second;
			s.end=c.second-b;
			diags[1][c.first].push_back(s);
		}
	}
	std::size_t best=0;
	std::pair<std::size_t, std::size_t> bestp;
	for(std::size_t d=0;d<2*n;d++){
		std::set<Seg> ups;
		std::size_t j=0;
		for(std::size_t i=0;i<diags[0][d].size();i++){
			Seg down=diags[0][d][i];
			while(j<diags[1][d].size() && diags[1][d][j].end<=down.begin){
				ups.insert(diags[1][d][j]);
				j++;
			}
			Seg upq;
			upq.begin=down.end;
			upq.end=-1;
			std::set<Seg>::iterator it=ups.lower_bound(upq);
			if(it==ups.begin()) continue;
			--it;
			if(it->begin<down.begin) continue;
			std::size_t diff=it->begin-down.begin;
			if(diff>best){
				best=diff;
				bestp=undiag(d, down.begin);
			}
		}
	}
	std::cout<<best<<' '<<bestp.first+1<<' '<<bestp.second+1<<'\n';
	return 0;
}
