#include<stdio.h>
#include<string.h>

#define NMAX 16

int viz[NMAX][NMAX];
int mat[NMAX][NMAX];
int solm=0,n;

int dx[4][10],dy[4][10];
int v1[10]={1,1,1,2,3,3,3,3,3,4};
int v2[10]={-1,0,1,0,-2,-1,0,1,2,0};

void retin()
{
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			mat[i][j]=viz[i][j];
}

void back(int px,int py,int ales)
{
	if(px==n+1 && py==1)
	{
		if(ales>solm)
		{
			solm=ales;
			retin();
		}	
		return ;
	}
	
	if(py==n)
		back(px+1,1,ales);
	else
		back(px,py+1,ales);
	if(viz[px][py])
		return ;
	
	int i,dir;
	for(dir=0;dir<4;dir++)
	{
		for(i=0;i<10;i++)
			if(viz[px+dx[dir][i]][py+dy[dir][i]])
				break;
		if(i<10)	
			continue;
		for(i=0;i<10;i++)
			viz[px+dx[dir][i]][py+dy[dir][i]]=ales+1;
		viz[px][py]=ales+1;
		if(py==n)
			back(px+1,1,ales+1);
		else
			back(px,py+1,ales+1);
		for(i=0;i<10;i++)
			viz[px+dx[dir][i]][py+dy[dir][i]]=0;	
		viz[px][py]=0;
	}	
}

int main ()
{
	int i,j;
	freopen("avioane.in","r",stdin);
	freopen("avioane.out","w",stdout);
	memset(mat,0,sizeof(mat));
	memset(viz,0,sizeof(viz));
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			scanf("%d",&viz[i][j]);
	for(i=1;i<=n;i++)
		viz[0][i]=viz[n+1][i]=viz[i][0]=viz[i][n+1]=1;
		
	for(i=0;i<10;i++)
		dx[0][i]=dy[3][i]=-v1[i];
	
	for(i=0;i<10;i++)
		dy[1][i]=dx[2][i]=v1[i];
	
	for(i=0;i<10;i++)
		dy[0][i]=dx[1][i]=dy[2][i]=dx[3][i]=v2[i];
		
	back(1,1,0);		
	printf("%d\n",solm);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<n;j++)
			printf("%d ",mat[i][j]);
		printf("%d\n",mat[i][n]);
	}	
	return 0;
}




