#include <iostream>
using namespace std;
int
n, g[11][11], prime[201], gc, usednumbers[101];
void
__read__()
{
cin >> n;
}
void
__init__()
{
prime[0] = true;
prime[1] = true;
prime[2] = false;
for( int i = 2; i <= 2 * n * n; i++ )
for( int j = 2; i * j <= 2 * n * n; j++ )
prime[i * j] = true;
}
void
__outp__()
{
for( int i = 1; i <= n; i++ )
{
for( int j = 1; j < n; j++ )
cout << g[i][j] << " ";
cout << g[i][n] << endl;
}
cout << endl;
}
bool
valid( int col, int row, int num )
{
if( col == 1 && row == 1 )
return true;
if( col > 1 && row == 1 )
if( !prime[g[row][col - 1] + num] )
return true;
if( col == 1 && row > 1 )
if( !prime[g[row - 1][col] + num] )
return true;
if( col > 1 && row > 1 )
if( !prime[g[row][col - 1] + num]
&& !prime[g[row - 1][col] + num] )
return true;
return false;
}
void
__dfs__( int col, int row, int x )
{
if( x > n * n )
if( gc < 5 )
{
gc++;
__outp__();
}
if( gc >= 5 )
exit( 0 );
if( x <= n * n )
for( int i = 1; i <= n * n; i++ )
if( !usednumbers[i] )
if( valid( col, row, i ) )
{
usednumbers[i] = true;
g[row][col] = i;
if( !( x % n ) )
__dfs__( 1, row + 1, x + 1 );
else
__dfs__( col + 1, row, x + 1 );
usednumbers[i] = false;
}
}
int
main()
{
__read__();
__init__();
__dfs__( 1, 1, 1 );
if( !gc )
cout << "0" << endl;
return 0;
}