#include <fstream>
using namespace std;
ifstream fin ("permutari.in");
ofstream fout ("permutari.out");
int n, v[10];
void write() {
for (int i = 1; i <= n; i++) {
fout << v[i] << " ";
}
fout << "\n";
}
bool valid (int k) {
for (int i = 1; i <= k - 1; i++) { // comparam fiecare element din vectorul v cu ultimul element selectat
if (v[i] == v[k]) { //deoarece într-o permutare elementele nu au voie să se repete,
return false; //returnăm 0 în cazul în care elementul selectat, a mai fost selectat o dată
}
}
return true; //returnăm 1 în cazul în care elementul nu mai apare în vector
}
/* b(1) [1]
b(1) -> b(2) [1, 1]
b(1) -> b(2) [1, 2]
b(1) -> b(2) -> b(3) [1, 2, 1]
b(1) -> b(2) -> b(3) [1, 2, 2]
b(1) -> b(2) -> b(3) [1, 2, 3] ~ 1 2 3
b(1) -> b(2) [1, 3]
b(1) -> b(2) -> b(3) [1, 3, 1]
b(1) -> b(2) -> b(3) [1, 3, 2] ~ 1 3 2
b(1) -> b(2) -> b(3) [1, 3, 3]
b(1) -> b(2)
b(1) [2]
b(1) -> b(2) [2, 1]
b(1) -> b(2) -> b(3) [2, 1, 1]
b(1) -> b(2) -> b(3) [2, 1, 2]
b(1) -> b(2) -> b(3) [2, 1, 3] ~ 2 1 3
b(1) -> b(2) [2, 2]
b(1) -> b(2) [2, 3]
b(1) -> b(2) -> b(3) [2, 3, 1] ~ 2 3 1
b(1) -> b(2) -> b(3) [2, 3, 2]
b(1) -> b(2) -> b(3) [2, 3, 3]
b(1) -> b(2)
b(1) [3]
b(1) -> b(2) [3, 1]
b(1) -> b(2) -> b(3) [3, 1, 1]
b(1) -> b(2) -> b(3) [3, 1, 2] ~ 3 1 2
b(1) -> b(2) -> b(3) [3, 1, 3]
b(1) -> b(2) [3, 2]
b(1) -> b(2) -> b(3) [3, 2, 1] ~ 3 2 1
b(1) -> b(2) -> b(3) [3, 2, 2]
b(1) -> b(2) -> b(3) [3, 2, 3]
b(1) -> b(2) [3, 3]
b(1)
*/
void backtracking (int k) {
for (int i = 1; i <= n; i++) { //parcurgem elementele mulţimii Sk
v[k] = i; //selectăm un element din mulţimea Sk
if (valid(k)) { //verificăm dacă eelementul ales îndeplineşte condiiile de continuare
if (k == n) { //se afişează soluţia obţinută
write();
}
else {
backtracking(k + 1); //reapemăm funcţia pentru poziţia k+1 din vectorul v
}
}
}
}
int main() {
fin >> n;
backtracking(1);
return 0;
}