#include <iostream>
#include 
<stdlib.h>
using namespace std;
int n,data[100];
void solve(int t)
{
//    for (int i=1;i<=n;i++)
//            cout<<data[i]<<' ';
//            cout<<endl;
    if (t==n)
    
{
//        system("pause");
//        cout<<"final";
        for (int i=1;i<=n;i++)
            cout
<<data[i]<<' ';
            cout
<<endl;
        
return;
    }

    
for (int i=t;i<=n;i++)
    
{
        swap(data[i],data[t]);
        solve (t
+1);
        swap(data[i],data[t]);
    }

}

int main()
{
    cin
>>n;
    
for (int i=1;i<=n;i++)
        data[i]
=i;
    solve(
1);
    cin
>>n;
}

/*
我发现从扎实的基础必须从深刻理解基本知识 开始
这个递归的过程是这样的
首先 第一位跟第一位交换 
一直交换T==N
此时输出没有交换的情况
然后返回上一层递归
在这一层里面T=N-1
而且循环元素是第二个,所以先跟第三个交换
然后再返回上一层
以第一个为循环元素 
跟第二个循环
然后再以第二个元素……
如此往复
把整个图表构造出来~~~
哇咔咔  自己想出来了  OH YEAH!
3
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
*/