#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
struct Spotkanie
{
int start, end; //czasy przechowujemy w minutach
int id;
};
int main()
{
ios_base::sync_with_stdio(false);
//cin.tie(nullptr);
int t;
cin >> t;
while (t--)
{
int ile_sal, ile_spotkan;
cin >> ile_sal >> ile_spotkan;
list<Spotkanie> spotkania;
for (int i = 0; i < ile_spotkan; ++i)
{
int rg, rm, zg, zm;
char dummy;
cin >> rg >> dummy >> rm >> zg >> dummy >> zm;
spotkania.push_back(Spotkanie{rg * 60 + rm, zg * 60 + zm, i + 1});
}
spotkania.sort([](const Spotkanie& a, const Spotkanie& b)->bool
{
if (a.start != b.start)
{
return a.start < b.start;
}
return a.end > b.end;
});
vector<vector<int>> sale(ile_spotkan); //bedzie przechowywac poszczegolne sale, a one poszczegolne spotkania, ktore sie w nich odbeda
int odbedzie_sie = 0;
for (int i = 0; i < ile_spotkan; ++i) //zachlannie pakujemy spotkania do kazdej sali po kolei
{
int koniec_obecnego = -1;
if (spotkania.empty()) //jesli nie wykorzystamy wszystkich sal
{
break;
}
for (auto spotkanie = spotkania.begin(); spotkanie != spotkania.end();)
{
if (spotkanie->start >= koniec_obecnego) //jesli mozna wsadzic do obecnej sali jeszcze jedno spotkanie
{
koniec_obecnego = spotkanie->end;
sale[i].push_back(spotkanie->id);
spotkanie = spotkania.erase(spotkanie);
}
else
{
++spotkanie;
}
}
}
sort(sale.begin(), sale.end(), [](const auto& a, const auto& b)->bool {return a.size() > b.size();});
for (int i = 0; i < min(ile_sal, ile_spotkan); ++i)
{
odbedzie_sie += sale[i].size();
}
cout << odbedzie_sie << '\n';
for (int i = 0; i < min(ile_sal, ile_spotkan); ++i)
{
if (sale[i].empty())
{
break;
}
for (int j: sale[i])
{
cout << j << ' ';
}
cout << '\n';
}
cout << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgU3BvdGthbmllCnsKICAgIGludCBzdGFydCwgZW5kOyAvL2N6YXN5IHByemVjaG93dWplbXkgdyBtaW51dGFjaAogICAgaW50IGlkOwp9OwoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCS8vY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBpbnQgaWxlX3NhbCwgaWxlX3Nwb3RrYW47CiAgICAgICAgY2luID4+IGlsZV9zYWwgPj4gaWxlX3Nwb3RrYW47CiAgICAgICAgbGlzdDxTcG90a2FuaWU+IHNwb3RrYW5pYTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbGVfc3BvdGthbjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHJnLCBybSwgemcsIHptOwogICAgICAgICAgICBjaGFyIGR1bW15OwoKICAgICAgICAgICAgY2luID4+IHJnID4+IGR1bW15ID4+IHJtID4+IHpnID4+IGR1bW15ID4+IHptOwoKICAgICAgICAgICAgc3BvdGthbmlhLnB1c2hfYmFjayhTcG90a2FuaWV7cmcgKiA2MCArIHJtLCB6ZyAqIDYwICsgem0sIGkgKyAxfSk7CiAgICAgICAgfQoKICAgICAgICBzcG90a2FuaWEuc29ydChbXShjb25zdCBTcG90a2FuaWUmIGEsIGNvbnN0IFNwb3RrYW5pZSYgYiktPmJvb2wKICAgICAgICB7CiAgICAgICAgICAgIGlmIChhLnN0YXJ0ICE9IGIuc3RhcnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBhLnN0YXJ0IDwgYi5zdGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYS5lbmQgPiBiLmVuZDsKICAgICAgICB9KTsKCiAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBzYWxlKGlsZV9zcG90a2FuKTsgLy9iZWR6aWUgcHJ6ZWNob3d5d2FjIHBvc3pjemVnb2xuZSBzYWxlLCBhIG9uZSBwb3N6Y3plZ29sbmUgc3BvdGthbmlhLCBrdG9yZSBzaWUgdyBuaWNoIG9kYmVkYQogICAgICAgIGludCBvZGJlZHppZV9zaWUgPSAwOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlsZV9zcG90a2FuOyArK2kpIC8vemFjaGxhbm5pZSBwYWt1amVteSBzcG90a2FuaWEgZG8ga2F6ZGVqIHNhbGkgcG8ga29sZWkKICAgICAgICB7CiAgICAgICAgICAgIGludCBrb25pZWNfb2JlY25lZ28gPSAtMTsKICAgICAgICAgICAgaWYgKHNwb3RrYW5pYS5lbXB0eSgpKSAvL2plc2xpIG5pZSB3eWtvcnp5c3RhbXkgd3N6eXN0a2ljaCBzYWwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoYXV0byBzcG90a2FuaWUgPSBzcG90a2FuaWEuYmVnaW4oKTsgc3BvdGthbmllICE9IHNwb3RrYW5pYS5lbmQoKTspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChzcG90a2FuaWUtPnN0YXJ0ID49IGtvbmllY19vYmVjbmVnbykgLy9qZXNsaSBtb3puYSB3c2FkemljIGRvIG9iZWNuZWogc2FsaSBqZXN6Y3plIGplZG5vIHNwb3RrYW5pZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGtvbmllY19vYmVjbmVnbyA9IHNwb3RrYW5pZS0+ZW5kOwogICAgICAgICAgICAgICAgICAgIHNhbGVbaV0ucHVzaF9iYWNrKHNwb3RrYW5pZS0+aWQpOwogICAgICAgICAgICAgICAgICAgIHNwb3RrYW5pZSA9IHNwb3RrYW5pYS5lcmFzZShzcG90a2FuaWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICsrc3BvdGthbmllOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzb3J0KHNhbGUuYmVnaW4oKSwgc2FsZS5lbmQoKSwgW10oY29uc3QgYXV0byYgYSwgY29uc3QgYXV0byYgYiktPmJvb2wge3JldHVybiBhLnNpemUoKSA+IGIuc2l6ZSgpO30pOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluKGlsZV9zYWwsIGlsZV9zcG90a2FuKTsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgb2RiZWR6aWVfc2llICs9IHNhbGVbaV0uc2l6ZSgpOwogICAgICAgIH0KCiAgICAgICAgY291dCA8PCBvZGJlZHppZV9zaWUgPDwgJ1xuJzsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbihpbGVfc2FsLCBpbGVfc3BvdGthbik7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzYWxlW2ldLmVtcHR5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGludCBqOiBzYWxlW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3V0IDw8IGogPDwgJyAnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb3V0IDw8ICdcbic7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgJ1xuJzsKICAgIH0KfQo=
MgoxIDMKMDA6MDAgMDI6MDAKMDA6MDEgMDA6MDIKMDA6MDIgMDA6MDMKMiA2CjAxOjAwIDAzOjAwCjAzOjAwIDA5OjAwCjAxOjAwIDA1OjAwCjA1OjAwIDA3OjAwCjA3OjAwIDEwOjAwCjA5OjAwIDEwOjAw
2
1 3
00:00 02:00
00:01 00:02
00:02 00:03
2 6
01:00 03:00
03:00 09:00
01:00 05:00
05:00 07:00
07:00 10:00
09:00 10:00