#include<bits/stdc++.h>
#define MAX 15
using namespace std;
using gg=long long;
gg sum = 0;
vector<vector<int> > res;
int n;
vector<int> c(MAX);//c[i]表示第i行的第c[i]列放了一个皇后
int matr[MAX][MAX];
int zhudu[100];//主对角线是否被占用
int fudui[100];//副对角线是否被占用
int col[100];//列是否被占用
void dfs(int start)
{
if(start == n) //所有皇后都放完了而且不冲突
{
vector<int> temp(n);//定义解
for(int i=0;i<n;i++)
{
temp[i]=c[i]+1;
}
res.push_back(temp);
sum+=1;
return;
}
for(int i=0;i<n;i++)
{
if(!col[i]&&!zhudu[start+i]&&!fudui[start-i+n])
{
c[start]=i;//第start行放到第i列
col[i]=1;
zhudu[start+i]=1;
fudui[start-i+n]=1;
dfs(start+1);
//回溯
col[i]=0;
zhudu[start+i]=0;
fudui[start-i+n]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
for(int i=0;i<3;i++)
{
for(int j=0;j<n;j++)
{
cout<<res[i][j]<<" ";
}
cout<<"\n";
}
cout<<sum<<"\n";
return 0;
}