#include<bits/stdc++.h>
using namespace std;
#define int long long
#define up(i,l,r) for(int i=(l);i<=(r);++i)
const int N=2e5+5;
int n,m;
vector<int> vec[N];
struct node_{
int s,t,id;
}p[N];
bool operator<(const node_ &x,const node_ &y){
return x.t<y.t;
}
struct seg_t{
struct node{
int mn,lz;
}t[N<<2];
inline int ls(int u){return u<<1;}
inline int rs(int u){return u<<1|1;}
inline void push_up(int u){
t[u].mn=min(t[ls(u)].mn,t[rs(u)].mn);
}
inline void update(int u,int l,int r,int x,int k){
if(l==r){
t[u].mn=k;
return;
}
push_up(u);
int mid=(l+r)>>1;
if(x<=mid) update(ls(u),l,mid,x,k);
else update(rs(u),mid+1,r,x,k);
push_up(u);
}
inline int query(int u,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r){
return t[u].mn;
}
int mid=(l+r)>>1;
push_up(u);
int mnn=2e9;
if(ql<=mid) mnn=min(mnn,query(ls(u),l,mid,ql,qr));
if(qr>mid) mnn=min(mnn,query(rs(u),mid+1,r,ql,qr));
return mnn;
}
}bit;
int32_t main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
up(i,1,n){
cin>>p[i].s>>p[i].t;p[i].id=i;
}
sort(p+1,p+n+1);
up(i,1,n){
int l=1,r=m,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(bit.query(1,1,m,1,mid)<=p[i].t){
r=mid-1;ans=mid;
}else{
l=mid+1;
}
}
bit.update(1,1,m,ans,p[i].t+p[i].s);
vec[ans].push_back(p[i].id);
}
up(i,1,m){
cout<<vec[i].size()<<' ';
sort(vec[i].begin(),vec[i].end());
for(auto it:vec[i]){
cout<<it<<' ';
}
cout<<'\n';
}
return 0;
}