#include <iostream>
#include <vector>
#include <list>
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});
spotkania.back().id = i + 1;
}
spotkania.sort([](const Spotkanie& a, const Spotkanie& b)->bool
{
return a.end < b.end;
});
vector<vector<int>> sale(ile_sal); //bedzie przechowywac poszczegolne sale, a one poszczegolne spotkania, ktore sie w nich odbeda
int odbedzie_sie = 0;
for (int i = 0; i < ile_sal; ++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);
++odbedzie_sie;
}
else
{
++spotkanie;
}
}
}
cout << odbedzie_sie << '\n';
for (const auto& vec: sale)
{
for (int i: vec)
{
cout << i << ' ';
}
if (!vec.empty()) //niewypisywanie pustych linii dla pustych sal
{
cout << '\n';
}
}
cout << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgU3BvdGthbmllCnsKICAgIGludCBzdGFydCwgZW5kOyAvL2N6YXN5IHByemVjaG93dWplbXkgdyBtaW51dGFjaAogICAgaW50IGlkOwp9OwoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCS8vY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBpbnQgaWxlX3NhbCwgaWxlX3Nwb3RrYW47CiAgICAgICAgY2luID4+IGlsZV9zYWwgPj4gaWxlX3Nwb3RrYW47CiAgICAgICAgbGlzdDxTcG90a2FuaWU+IHNwb3RrYW5pYTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbGVfc3BvdGthbjsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHJnLCBybSwgemcsIHptOwogICAgICAgICAgICBjaGFyIGR1bW15OwoKICAgICAgICAgICAgY2luID4+IHJnID4+IGR1bW15ID4+IHJtID4+IHpnID4+IGR1bW15ID4+IHptOwoKICAgICAgICAgICAgc3BvdGthbmlhLnB1c2hfYmFjayhTcG90a2FuaWV7cmcgKiA2MCArIHJtLCB6ZyAqIDYwICsgem19KTsKICAgICAgICAgICAgc3BvdGthbmlhLmJhY2soKS5pZCA9IGkgKyAxOwogICAgICAgIH0KCiAgICAgICAgc3BvdGthbmlhLnNvcnQoW10oY29uc3QgU3BvdGthbmllJiBhLCBjb25zdCBTcG90a2FuaWUmIGIpLT5ib29sCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gYS5lbmQgPCBiLmVuZDsKICAgICAgICB9KTsKCiAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBzYWxlKGlsZV9zYWwpOyAvL2JlZHppZSBwcnplY2hvd3l3YWMgcG9zemN6ZWdvbG5lIHNhbGUsIGEgb25lIHBvc3pjemVnb2xuZSBzcG90a2FuaWEsIGt0b3JlIHNpZSB3IG5pY2ggb2RiZWRhCiAgICAgICAgaW50IG9kYmVkemllX3NpZSA9IDA7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWxlX3NhbDsgKytpKSAvL3phY2hsYW5uaWUgcGFrdWplbXkgc3BvdGthbmlhIGRvIGthemRlaiBzYWxpIHBvIGtvbGVpCiAgICAgICAgewogICAgICAgICAgICBpbnQga29uaWVjX29iZWNuZWdvID0gLTE7CiAgICAgICAgICAgIGlmIChzcG90a2FuaWEuZW1wdHkoKSkgLy9qZXNsaSBuaWUgd3lrb3J6eXN0YW15IHdzenlzdGtpY2ggc2FsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGF1dG8gc3BvdGthbmllID0gc3BvdGthbmlhLmJlZ2luKCk7IHNwb3RrYW5pZSAhPSBzcG90a2FuaWEuZW5kKCk7KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3BvdGthbmllLT5zdGFydCA+PSBrb25pZWNfb2JlY25lZ28pIC8vamVzbGkgbW96bmEgd3NhZHppYyBkbyBvYmVjbmVqIHNhbGkgamVzemN6ZSBqZWRubyBzcG90a2FuaWUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBrb25pZWNfb2JlY25lZ28gPSBzcG90a2FuaWUtPmVuZDsKICAgICAgICAgICAgICAgICAgICBzYWxlW2ldLnB1c2hfYmFjayhzcG90a2FuaWUtPmlkKTsKICAgICAgICAgICAgICAgICAgICBzcG90a2FuaWUgPSBzcG90a2FuaWEuZXJhc2Uoc3BvdGthbmllKTsKICAgICAgICAgICAgICAgICAgICArK29kYmVkemllX3NpZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICArK3Nwb3RrYW5pZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY291dCA8PCBvZGJlZHppZV9zaWUgPDwgJ1xuJzsKICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHZlYzogc2FsZSkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IGk6IHZlYykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY291dCA8PCBpIDw8ICcgJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCF2ZWMuZW1wdHkoKSkgLy9uaWV3eXBpc3l3YW5pZSBwdXN0eWNoIGxpbmlpIGRsYSBwdXN0eWNoIHNhbAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICdcbic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY291dCA8PCAnXG4nOwogICAgfQp9Cg==
MwoyIDMKMTE6MjAgMTI6MDAKMTE6MzAgMTE6NDAKMTE6NDAgMTE6NTUKMyA2CjE3OjE1IDE4OjMwCjE3OjIwIDE5OjAwCjE3OjE1IDE4OjAwCjE2OjU1IDE3OjU1CjE3OjEwIDE4OjEwCjE3OjAwIDE4OjAwCjEwMDAwMCA2CjExOjEzIDExOjE0CjEwOjE0IDEwOjUwCjA5OjQ1IDA5OjU1CjAwOjAwIDAwOjA3CjAxOjAwIDAyOjAwCjAzOjAwIDA3OjAw
3
2 3
11:20 12:00
11:30 11:40
11:40 11:55
3 6
17:15 18:30
17:20 19:00
17:15 18:00
16:55 17:55
17:10 18:10
17:00 18:00
100000 6
11:13 11:14
10:14 10:50
09:45 09:55
00:00 00:07
01:00 02:00
03:00 07:00