#include <iostream>
using namespace std;
// 从n个数中选k个数全排(组合)
int n,k;
int res[15]; // 答案数字
bool vis[15]; // 标记数组,0表示没被选过,1表示被选
// 函数作用:表示当前选的是第几个数(总共要选k个数)
void dfs(int x){
// 当前选的数超过k个,就结束搜索(x等于k,即dfs(k)表示选第k个数)
if(x>k){
// 输出答案,有k个数字所以要用循环
for(int i=1;i<=k;i++){
cout<<res[i]<<" ";
}
cout<<endl;
return;
}
// 从1~n个数中选
for(int i=1;i<=n;i++){
// 全排列:没有数字大小限制,只有一个条件:数字没被选过即可
// if(vis[i] != 1){
// 组合:数字没被选过 && 当前选的数字不能小于前一个数字
// 也就是说,1 2 3 和 2 3 1是一种方案
if(vis[i] != 1 && res[x-1]<i){
res[x] = i; // 把这个数字记录到答案数组中
vis[i] = 1; // 标记这个数字,后面的搜索中不能再选了
dfs(x+1); // 递归搜索下一个数字
vis[i] = 0; // 回溯,本次搜索完后,后续的其他搜索中也可能有这个数字
}
}
}
int main(){
cin>>n>>k;
dfs(1);
return 0;
}