#include<bits/stdc++.h>
using namespace std;
int grid[10][10],N,n;
bool UsedInRow(int row,int num)
{
for(int col=0; col<N; col++)
{
if(grid[row][col]==num)
{
return true;
}
}
return false;
}
bool UsedInCol(int col,int num)
{
for(int row=0; row<N; row++)
{
if(grid[row][col]==num)
{
return true;
}
}
return false;
}
bool UsedInBox(int BoxStRow,int BoxStCol,int num)
{
for(int row=0; row<n; row++)
{
for(int col=0; col<n; col++)
{
if(grid[row+BoxStRow][col+BoxStCol]==num)
{
return true;
}
}
}
return false;
}
bool isSafe(int row,int col,int num)
{
return !UsedInRow(row,num)&&
!UsedInCol(col,num)&&
!UsedInBox(row-row%n,col-col%n,num);
}
bool SuDoku()
{
bool tag = false;
int row,col;
for(row=0; row<N; row++)
{
for(col=0; col<N; col++)
{
if(grid[row][col]==0)
{
tag = true;
break;
}
}
if(tag)
{
break;
}
}
if(!tag)
{
return true;
}
for(int num=1; num<=N; num++)
{
if(isSafe(row,col,num))
{
grid[row][col] = num;
if(SuDoku())
{
return true;
}
grid[row][col] = 0;
}
}
return false;
}
int main()
{
int tc = 1;
while(scanf("%d",&n)==1)
{
N = n*n;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
scanf("%d",&grid[i][j]);
}
}
if(tc!=1)
{
puts("");
}
tc = 2;
if(SuDoku())
{
for(int i=0; i<N; i++)
{
printf("%d",grid[i][0]);
for(int j=1; j<N; j++)
{
printf(" %d",grid[i][j]);
}
puts("");
}
}
else
{
puts("NO SOLUTION");
}
}
return 0;
}