#include <iostream>
using namespace std;
const int N = 10;
int n;
int num[N];
bool st[N];
void dfs(int u)
{
if (u > n) //判断是否为叶子节点
{
for (int i = 1; i <= n; i ++ ) cout << num[i] << ' ';
cout << endl;
return;
}
for (int i = 1; i <= n; i ++ )
if (!st[i])
{
num[u] = i; //当前位赋值为i
st[i] = true;
dfs(u + 1);
st[i] = false; //还原现场,不需要把num[u]的值还原成0,因为每次都会直接覆盖
}
}
int main()
{
cin >> n;
dfs(1);
return 0;
}