#include<iostream>
using namespace std;
int n;
int mark[11]={0};
int a[11];
void dfs(int step)
{
//判断边界
if(step==n+1)
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return;
}
//循环每一种可能
for(int i=1;i<=n;i++)
{
if(mark[i]==0)
{
mark[i]=1;
a[step]=i;
//当前步数有额外可能了继续进入下一步
dfs(step+1);
mark[i]=0;//回溯回来,把原排列拿开,尝试其他可能
}
}
return ;
}
int main()
{
cin>>n;
dfs(1);
return 0;
}