#include<iostream>
using namespace std;
const int N=10;
int n;
int path[N];
bool st[N];//用于存储数字使用状态,例如st[i]表示,i是否被使用过,所以每次dfs后都要将st[i]还原置为0;
void dfs(int u)
{
if(u==n)//如果是最后一层,则将路径输出
{
for(int i=0;i<n;i++)
{
cout<<path[i]<<" ";
}cout<<endl;
}
for(int i=1;i<=n;i++)//如果不是最后一层,则遍历所有有效数组,将可以填入的数字依次遍历
{
if(!st[i])//如果这个数字没有被使用过(按字典序遍历)
{
path[u]=i;//则将数字填入该路径
st[i]=true;//并将数字状态置为已使用
dfs(u+1);//在继续遍历下一层路径
st[i]=false;//遍历完后,恢复原状态
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}