#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>> in[3000005];
vector<pair<int,int>> out[3000005];
vector<int> graf[3000005];
vector<int> visited(3000005, 0);
bool hasCycle = false;
void dfs(int u) {
if (hasCycle) return;
visited[u] = 1;
for (int v : graf[u]) {
if (visited[v] == 0) {
dfs(v);
} else if (visited[v] == 1) {
hasCycle = true;
return;
}
}
visited[u] = 2;
}
int main()
{
int mil = 1000000;
int n,m,a,b,c;
cin >> n >> m;
for(int i =0;i < m;++i)
{
cin >> a >> b >> c;
out[a].push_back({c,i});
in[b].push_back({c,i});
}
for(int i = 1;i <= n;++i)
{
graf[mil+i].push_back(i);
graf[2*mil+i].push_back(i);
}
for(int i = 1;i <= n;++i)
{
sort(in[i].begin(),in[i].end());
sort(out[i].begin(),out[i].end());
for(int j = 0;j < (int)out[i].size()-1;++j)
{
graf[mil+out[i][j].second].push_back(mil+out[i][j+1].second);
graf[2*mil+out[i][j+1].second].push_back(2*mil+out[i][j].second);
}
}
int l,p;
for(int i = 1;i <= n;++i)
{
l=0,p=0;
for(int j = 0;j < (int)in[i].size();++j)
{
while(l < (int)out[i].size() && out[i][l].first < in[i][j].first)
{
l++;
}
if(l < (int)out[i].size() && out[i][l].first == in[i][j].first)
{
p = l;
while(p+1 < (int)out[i].size() && out[i][p+1].first == in[i][j].first)
{
p++;
}
if(l > 0)
{
graf[in[i][j].second].push_back(2*mil+out[i][l-1].second);
}
if(p+1 < (int)out[i].size())
{
graf[in[i][j].second].push_back(mil+out[i][p+1].second);
}
}
else if (!out[i].empty())
{
graf[in[i][j].second].push_back(mil+out[i][0].second);
}
}
}
for(int i = 0;i < m;++i)
{
cout << i << " :";
for(int j : graf[i])
{
cout << j << ' ';
}
cout << endl;
}
// Cycle detection
for(int i = 0; i < 3*mil; ++i)
{
if (!graf[i].empty() && visited[i] == 0)
{
dfs(i);
if (hasCycle) break;
}
}
if (hasCycle)
cout << "Cycle detected in the graph." << endl;
else
cout << "No cycle found in the graph." << endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3RvcjxwYWlyPGludCxpbnQ+PiBpblszMDAwMDA1XTsKdmVjdG9yPHBhaXI8aW50LGludD4+IG91dFszMDAwMDA1XTsKdmVjdG9yPGludD4gZ3JhZlszMDAwMDA1XTsKCnZlY3RvcjxpbnQ+IHZpc2l0ZWQoMzAwMDAwNSwgMCk7CmJvb2wgaGFzQ3ljbGUgPSBmYWxzZTsKCnZvaWQgZGZzKGludCB1KSB7CiAgICBpZiAoaGFzQ3ljbGUpIHJldHVybjsKICAgIHZpc2l0ZWRbdV0gPSAxOwogICAgZm9yIChpbnQgdiA6IGdyYWZbdV0pIHsKICAgICAgICBpZiAodmlzaXRlZFt2XSA9PSAwKSB7CiAgICAgICAgICAgIGRmcyh2KTsKICAgICAgICB9IGVsc2UgaWYgKHZpc2l0ZWRbdl0gPT0gMSkgewogICAgICAgICAgICBoYXNDeWNsZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICB2aXNpdGVkW3VdID0gMjsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgbWlsID0gMTAwMDAwMDsKICAgIGludCBuLG0sYSxiLGM7CiAgICBjaW4gPj4gbiA+PiBtOwogICAgZm9yKGludCBpID0wO2kgPCBtOysraSkKICAgIHsKICAgICAgICBjaW4gPj4gYSA+PiBiID4+IGM7CiAgICAgICAgb3V0W2FdLnB1c2hfYmFjayh7YyxpfSk7CiAgICAgICAgaW5bYl0ucHVzaF9iYWNrKHtjLGl9KTsKICAgIH0KICAgIGZvcihpbnQgaSA9IDE7aSA8PSBuOysraSkKICAgIHsKICAgICAgICBncmFmW21pbCtpXS5wdXNoX2JhY2soaSk7CiAgICAgICAgZ3JhZlsyKm1pbCtpXS5wdXNoX2JhY2soaSk7CiAgICB9CiAgICBmb3IoaW50IGkgPSAxO2kgPD0gbjsrK2kpCiAgICB7CiAgICAgICAgc29ydChpbltpXS5iZWdpbigpLGluW2ldLmVuZCgpKTsKICAgICAgICBzb3J0KG91dFtpXS5iZWdpbigpLG91dFtpXS5lbmQoKSk7CiAgICAgICAgZm9yKGludCBqID0gMDtqIDwgKGludClvdXRbaV0uc2l6ZSgpLTE7KytqKQogICAgICAgIHsKICAgICAgICAgICAgZ3JhZlttaWwrb3V0W2ldW2pdLnNlY29uZF0ucHVzaF9iYWNrKG1pbCtvdXRbaV1baisxXS5zZWNvbmQpOwogICAgICAgICAgICBncmFmWzIqbWlsK291dFtpXVtqKzFdLnNlY29uZF0ucHVzaF9iYWNrKDIqbWlsK291dFtpXVtqXS5zZWNvbmQpOwogICAgICAgIH0KICAgIH0KICAgIGludCBsLHA7CiAgICBmb3IoaW50IGkgPSAxO2kgPD0gbjsrK2kpCiAgICB7CiAgICAgICAgbD0wLHA9MDsKICAgICAgICBmb3IoaW50IGogPSAwO2ogPCAoaW50KWluW2ldLnNpemUoKTsrK2opCiAgICAgICAgewogICAgICAgICAgICB3aGlsZShsIDwgKGludClvdXRbaV0uc2l6ZSgpICYmIG91dFtpXVtsXS5maXJzdCA8IGluW2ldW2pdLmZpcnN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYobCA8IChpbnQpb3V0W2ldLnNpemUoKSAmJiBvdXRbaV1bbF0uZmlyc3QgPT0gaW5baV1bal0uZmlyc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHAgPSBsOwogICAgICAgICAgICAgICAgd2hpbGUocCsxIDwgKGludClvdXRbaV0uc2l6ZSgpICYmIG91dFtpXVtwKzFdLmZpcnN0ID09IGluW2ldW2pdLmZpcnN0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKGwgPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdyYWZbaW5baV1bal0uc2Vjb25kXS5wdXNoX2JhY2soMiptaWwrb3V0W2ldW2wtMV0uc2Vjb25kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHArMSA8IChpbnQpb3V0W2ldLnNpemUoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBncmFmW2luW2ldW2pdLnNlY29uZF0ucHVzaF9iYWNrKG1pbCtvdXRbaV1bcCsxXS5zZWNvbmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFvdXRbaV0uZW1wdHkoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZ3JhZltpbltpXVtqXS5zZWNvbmRdLnB1c2hfYmFjayhtaWwrb3V0W2ldWzBdLnNlY29uZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yKGludCBpID0gMDtpIDwgbTsrK2kpCiAgICB7CiAgICAgICAgY291dCA8PCBpIDw8ICIgOiI7CiAgICAgICAgZm9yKGludCBqIDogZ3JhZltpXSkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgaiA8PCAnICc7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgZW5kbDsKICAgIH0KCiAgICAvLyBDeWNsZSBkZXRlY3Rpb24KICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzKm1pbDsgKytpKQogICAgewogICAgICAgIGlmICghZ3JhZltpXS5lbXB0eSgpICYmIHZpc2l0ZWRbaV0gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGRmcyhpKTsKICAgICAgICAgICAgaWYgKGhhc0N5Y2xlKSBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGhhc0N5Y2xlKQogICAgICAgIGNvdXQgPDwgIkN5Y2xlIGRldGVjdGVkIGluIHRoZSBncmFwaC4iIDw8IGVuZGw7CiAgICBlbHNlCiAgICAgICAgY291dCA8PCAiTm8gY3ljbGUgZm91bmQgaW4gdGhlIGdyYXBoLiIgPDwgZW5kbDsKfQo=