#include <iostream>
#include <stack>
using namespace std;
int n, indexConfig;
int a[20][20];
int x[20];
int store[20];
bool visit[20];
bool hasResult = false;
void init(){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
a[i][j] = (i==j?0:1);
}
}
}
void initVisit(){
for(int i=1; i<=n; i++)
visit[i] = false;
}
void result(){
x[0] = x[n];
printf("Config %d: ", ++indexConfig);
for(int i=1; i<=n; i++){
printf("%d", x[i]);
if(i < n) printf(", ");
a[x[i]][x[i-1]] = a[x[i-1]][x[i]] = 0;
}
printf("\n");
// for(int i=1; i<=n; i++){
// for(int j=1; j<=n; j++){
// printf("%d ", a[i][j]);
// }
// printf("\n");
// }
}
void Try(int i){
if(hasResult) return;
for(int v=1; v<=n; v++){
if(a[x[i-1]][v] && !visit[v]){
x[i] = v;
if(i < n){
visit[v] = true;
Try(i+1);
visit[v] = false;
}else{
if(a[v][1]){
hasResult = true;
result();
return;
}
}
}
}
}
bool find(int s){
stack<int> stk;
stk.push(s);
x[1] = s;
visit[s] = true;
int i=2;
int u, v;
bool goBack = false;
while(!stk.empty()){
u = stk.top();
stk.pop();
if(goBack){
v = store[u]+1;
goBack = false;
}else{
v = 1;
}
for(; v<=n; v++){
if(a[u][v] && !visit[v]){
x[i] = v;
visit[v] = true;
if(i < n){
stk.push(u);
stk.push(v);
store[u] = v;
i++;
break;
}else{
if(a[v][1]) return true;
visit[v] = false;
}
}
}
if(v > n){
goBack = true;
visit[u] = false;
i--;
}
}
return false;
}
int main(){
printf("Nhap N: "); cin >> n;
init();
// do{
// initVisit();
// visit[1] = true;
// x[1] = 1;
// hasResult = false;
// Try(2);
// }while(hasResult);
while(1){
initVisit();
if(find(1)) result();
else break;
}
}