#include
using namespace std;
int a[10];//a数组记录每一份的值
bool vis[201][201][201][201][201][201];//vis数组记录每一种分法是否出现过
void dfs(int n,int k,int sum,int last)//n表示当前要分的数,k表示还需要分的份数
{//sum表示当前已经分的数的和,last表示上一份的值
if(k==1)//只剩下一份,直接输出答案
{
a[k]=n;//将剩余的数赋值给最后一份
if(!vis[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]])//如果这种分法之前没有出现过
{
for(int i=1;i<=k;i++)
cout<<a[i];//输出这种分法
cout<<endl;
vis[a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]=true;//将这种分法标记为出现过
}
return;//返回上一层
}
for(int i=1;i<n;i++)//枚举当前这份的值
{
if(last<=i)//如果当前这份的值大于上一份的值
{
a[k]=i;//将当前这份的值赋值给a[k]
dfs(n-i,k-1,sum+i,i);//递归处理下一份
}
}
}
int main()
{
int n,k;
cin>>n>>k;
dfs(n,k,0,0);//从第一份开始分,当前的和为0,上一份的值为0
return 0;