#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
****************************************************************/