#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 3000000
#define int long long
struct node
{
int s, t, printMachineId, fileId;
bool operator>(const node &a) const
{
return (s + t > a.s + a.t)||(s + t == a.s + a.t&&fileId > a.fileId);
}
} e[maxn];
priority_queue<node, vector<node>, greater<node>> runingPrintMachine;
priority_queue<int, vector<int>, greater<int>> leisurePrintMachine;
priority_queue<int, vector<int>, greater<int>> ans[maxn];
int n, m;
bool cmp(node a, node b)
{
return (a.t < b.t)||(a.fileId<b.fileId);
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
leisurePrintMachine.push(i);
}
for (int i = 1, s, t; i <= n; i++)
{
cin >> s >> t;
e[i].s = s, e[i].t = t, e[i].printMachineId = 0, e[i].fileId = i;
}
sort(e + 1, e + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
int now=0;
while (!runingPrintMachine.empty() && (runingPrintMachine.top().t + runingPrintMachine.top().s <= e[i].t || leisurePrintMachine.empty()))
{
leisurePrintMachine.push(runingPrintMachine.top().printMachineId);
now=runingPrintMachine.top().s+runingPrintMachine.top().t;
runingPrintMachine.pop();
}
runingPrintMachine.push({e[i].s, (e[i].t>=now?e[i].t:now), leisurePrintMachine.top(), e[i].fileId});
ans[leisurePrintMachine.top()].push(e[i].fileId);
leisurePrintMachine.pop();
}
for (int i = 1; i <= m; i++)
{
cout << ans[i].size() << " ";
while (!ans[i].empty())
{
cout << ans[i].top() << " ";
ans[i].pop();
}
cout << '\n';
}
return 0;
}