/*此方法超时,原因在于最大的排列数达到16!=2*(10的13次方)
故只能用搜索做!!!*/
#include<iostream>
#include<algorithm>
using namespace std;
int a[17];
int main(){
int n,m;
while(cin>>n>>m){
for(int i=0;i<n;i++) a[i]=i+1;//第一个排列
do{
int ok=1;
if(a[0]!=1||a[1]!=m) ok=0;
if(ok){
for(int i=0;i<n;i++) if((a[i]+a[(i+2)%n])%a[(i+1)%n]!=0&&(a[i]+a[(i+2)%n])>a[(i+1)%n]){ok=0;break;}
if(ok){
for(int i=0;i<n;i++) printf("%d ",a[i]);
printf("/n");}
}
}while(next_permutation(a+1,a+n));
printf("/n");
}
return 0;}
//回溯法!!!
#include<iostream>
using namespace std;
bool vis[18];
int a[18];
int n,m;
void dfs(int cur){
if(cur==n&&(a[0]+a[n-2]<a[n-1]||(a[0]+a[n-2])%a[n-1]==0)&&(a[1]+a[n-1]<a[0]||(a[1]+a[n-1])%a[0]==0)){
for(int i=0;i<n-1;i++) printf("%d ",a[i]);
printf("%d",a[n-1]);
printf("/n");}
else for(int i=2;i<=n;i++)
if(!vis[i]&&i!=m&&(i+a[cur-2]<a[cur-1]||(i+a[cur-2])%a[cur-1]==0)){
a[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
int main(){
int x=1;
while(cin>>n>>m){
if(x!=1) printf("/n");
memset(vis,0,sizeof(vis));
vis[0]=1;vis[m]=1;
a[0]=1;a[1]=m;
dfs(2);
x++;
}
return 0;}