#include<stdio.h>
#include<string.h>
const int N=1e3+10;
int a[N];
void f(int n,int *a,int cur)//一共有n个元素,从第cur个开始排
{
int i,j;
if(cur==n) //递归边界:当cur=n时,说明从0~n-1共n个元素已经全部排完,可以输出了
{
for(i=0; i<n; i++)
printf("%d ",a[i]);
printf("
");
}
else
{
for(i=1; i<=n; i++) //尝试在a[cur]中填各种整数i
{
int ok=1;//先假定a[cur]=i是可以的,在下面判断
for(j=0; j<cur; j++)
if(a[j]==i) //判断:如果i已经在a[0]~a[cur-1]出现过,则不能再选
{
ok=0;
break;
}
if(ok)
{
a[cur]=i;
f(n,a,cur+1); //递归调用:在a[cur]=i的条件下,接着找下一个元素可能的情况
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n))
f(n,a,0);
return 0;
}