#include<bits/stdc++.h>
using namespace std;
int r[10000];
int u;
void dg(int list[],int k,int m){
if(k==m){
int num = 0;
int t = 1;
for(int i=m;i>=0;i--){
num = num + list[i] * t;
t = t * 10;
}
r[u] = num;
u++;
}
else{
for(int i=k;i<=m;i++){
// 从固定的数后第一次进行交换
swap(list[k],list[i]);
//k+1:缩小数组长度
dg(list,k+1,m);
//一组递归完以后交换回来
swap(list[k],list[i]);
}
}
}
int main(){
int n,i;
cin>>n;
int a[20];
for(i = 0;i < n;i++){
a[i] = i + 1;
}
dg(a,0,n - 1);
sort(r,r + u);
int t[20],x,j,k;
for(i = 0;i < u;i++){
x = r[i];
k = 0;
while(x != 0){
t[k] = x % 10;
k++;
x = x / 10;
}
for(j = k - 1;j >= 0;j--){
cout<<t[j]<<" ";
}
cout<<endl;
}
}
/**************************************************************
Problem: 1308
User: admin
Language: C++
Result: Accepted
Time:45 ms
Memory:2116 kb
****************************************************************/