#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2e5+5;
int n,m;
int pt[N];//记录某个打印机在何时能将所有待打印文件打印出来
vector<int> h[N];//记录每个打印机打印什么文件的vector
struct T{
int id;//文件的编号
int s;//某文件需要的打印时间
int t;//下发命令的时刻
}d[N];//文件
bool cmp(T a,T b){//按照下发命令的时刻从小到大排序
return a.t < b.t;
}
struct node{
int id;//打印机编号
int pt;//记录某个打印机在何时能将所有待打印文件打印出来
bool operator < (const node &a) const{
if(pt == a.pt) return id > a.id;//时间相同就按编号从小到大排
else return pt > a.pt;
}
};
priority_queue<node> qw;//正在工作的打印机(按照剩余时间从小到大排序)
priority_queue<int,vector<int>,greater<int> > ql;
//空闲打印机(按照编号从小到大排序)
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&d[i].s,&d[i].t);
d[i].id=i;
}
sort(d+1,d+n+1,cmp);
for(int i=1;i<=m;i++){
ql.push(i);//初始时所有打印机都空闲
}
for(int i=1;i<=n;i++){//遍历每一个文件i
if(!qw.empty() && qw.top().pt < d[i].t){
ql.push(qw.top().id);//放到空闲打印机队列中
qw.pop();//出队
}
if(!ql.empty()){//有空闲的打印机能直接使用
h[ql.top()].push_back(i);
pt[ql.top()]=d[i].s+d[i].t-1;//直接赋值
ql.pop();
continue;
}
//没有空闲打印机能直接使用
node u=qw.top();
qw.pop();
pt[u.id]+=d[i].s;
qw.push(node{u.id,pt[u.id]});
h[u.id].push_back(i);
}
for(int i=1;i<=m;i++){
printf("%d ",h[i].size());
for(int j=0;j<h[i].size();j++){
printf("%d ",h[i][j]);
}
printf("\n");
}
return 0;
}