#include <cstdio>
#include <algorithm>

using namespace std;

#define NMAX 2007

int X[NMAX][NMAX],left[NMAX][NMAX],right[NMAX][NMAX],up[NMAX][NMAX],down[NMAX][NMAX],nearest_up[NMAX][NMAX],nearest_down[NMAX][NMAX],nearest_up_0[NMAX][NMAX],nearest_down_0[NMAX][NMAX];
int i,j,N,MAX,s,f,l,value;
pair < int ,int > point;
bool flag;

int main()
{
//freopen ("window.in","r",stdin);
//freopen ("window.out","w",stdout);	

for (i=1,scanf("%d",&N);i<=N;++i)
for (j=1;j<=N;++j) 
scanf("%d",&X[i][j]);

/*for (i=1;i<=N;++i,printf("\n"))
for (j=1;j<=N;++j)
printf("%d ",i);*/

for (i=2;i<=N-1;++i)
for (j=2;j<=N-1;++j)
{
	if (X[i][j]==X[i][j-1]) left[i][j]=1;
	if (X[i][j]==X[i][j+1]) right[i][j]=1;
	if (X[i][j]==X[i-1][j]) up[i][j]=1;
	if (X[i][j]==X[i+1][j]) down[i][j]=1;
}   

for (i=2;i<=N-1;++i)
for (j=2;j<=N-1;++j) 
{
	left[i][j]+=left[i-1][j];
	right[i][j]+=right[i-1][j];
}

for (i=2;i<=N-1;++i)
{
	nearest_up[i][N]=nearest_down[i][N]=N;
	nearest_up_0[i][N]=nearest_down_0[i][N]=N;
	for (j=N-1;j>=2;--j)
	{
		nearest_up[i][j]=(up[i][j]) ? j : nearest_up[i][j+1];
		nearest_down[i][j]=(down[i][j]) ? j : nearest_down[i][j+1];
		nearest_down_0[i][j]=(down[i][j]==0) ? j : nearest_down_0[i][j+1];
		nearest_up_0[i][j]=(up[i][j]==0) ? j : nearest_up_0[i][j+1];
	}
}
//totul bine pana aici

for (s=2;s<=N-1-MAX;++s) 
for (f=s+MAX;f<=N-1;++f)
{
	if (f==s) continue;
	
	l=f-s+1;
	j=2;

	while (j<=N-l)
	{	
		value=0;
		
		if (nearest_up[s][j]<=l+j-1) 
		value=nearest_up_0[s][nearest_up[s][j]];
		
		if (nearest_down[f][j]<=l+j-1)
		{
			j=max(value,nearest_down_0[f][nearest_down[f][j]]);
			continue;
		} 
		
		if (nearest_up[s][j]<=l+j-1)
		{
			j=value;
			continue;
		}
		
		if (left[f][j]-left[s-1][j]!=0 || right[f][j+l-1]-right[s-1][j+l-1]!=0) 
		{
			++j;
			continue;
		}
		
		MAX=l;
		point=make_pair(s,j);
		++j;
	}
}

printf("%d %d %d\n",MAX,point.first,point.second);

return 0;
}
