#include <bits/stdc++.h>
#define BASE 1000000007
using namespace std;
vector<int> Al[1010101], Alr[1010101];
vector<int> Comp[1010101];
int cost[1010101];
int used[1010101];
vector<int> order, component;
vector<vector<int> > components;
vector<int> nodes;
int dfs1(int v){
used[v] = true;
for (int i=0; i<Al[v].size(); i++){
if (!used[Al[v][i]]){
dfs1(Al[v][i]);
}
}
order.push_back(v);
return 0;
}
int dfs2(int v){
used[v] = true;
nodes.push_back(v);
for (int i=0; i<Alr[v].size(); i++){
if (!used[Alr[v][i]]){
dfs2(Alr[v][i]);
}
}
return 0;
}
int main() {
int n;
cin>>n; //number of vertices
int m;
cin>>m; //number of edges
int from,to;
for (int i=0; i<m; i++){
cin>>from>>to; //edges
Al[from].push_back(to); //G
Alr[to].push_back(from); //G_transpose
}
for (int i=1; i<=n; i++){
if (!used[i]){
dfs1(i); //mark vertices in order of finish time
}
}
reverse(order.begin(), order.end());
memset(used,0,sizeof(used));
for (int i=0; i<order.size(); i++){ //traverse vertices in decresing order of finish time
if (!used[i]){
nodes.clear();
dfs2(order[i]);
components.push_back(nodes);
}
}
for (int i=0; i<components.size(); i++){
cout<<"scc "<<i+1<<" -> ";
for (int j=0; j<components[i].size(); j++){
cout<<components[i][j]<<" ";
}
cout<<"\n";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgQkFTRSAxMDAwMDAwMDA3CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PiBBbFsxMDEwMTAxXSwgQWxyWzEwMTAxMDFdOwp2ZWN0b3I8aW50PiBDb21wWzEwMTAxMDFdOwppbnQgY29zdFsxMDEwMTAxXTsKaW50IHVzZWRbMTAxMDEwMV07CnZlY3RvcjxpbnQ+IG9yZGVyLCBjb21wb25lbnQ7CnZlY3Rvcjx2ZWN0b3I8aW50PiA+IGNvbXBvbmVudHM7CnZlY3RvcjxpbnQ+IG5vZGVzOwoKaW50IGRmczEoaW50IHYpewogICAgdXNlZFt2XSA9IHRydWU7CiAgICBmb3IgKGludCBpPTA7IGk8QWxbdl0uc2l6ZSgpOyBpKyspewogICAgICAgIGlmICghdXNlZFtBbFt2XVtpXV0pewogICAgICAgICAgICBkZnMxKEFsW3ZdW2ldKTsKICAgICAgICB9CiAgICB9CiAgICBvcmRlci5wdXNoX2JhY2sodik7CiAgICByZXR1cm4gMDsKfQoKaW50IGRmczIoaW50IHYpewogICAgdXNlZFt2XSA9IHRydWU7CiAgICBub2Rlcy5wdXNoX2JhY2sodik7CiAgICBmb3IgKGludCBpPTA7IGk8QWxyW3ZdLnNpemUoKTsgaSsrKXsKICAgICAgICBpZiAoIXVzZWRbQWxyW3ZdW2ldXSl7CiAgICAgICAgICAgIGRmczIoQWxyW3ZdW2ldKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKSB7CglpbnQgbjsKCWNpbj4+bjsgLy9udW1iZXIgb2YgdmVydGljZXMKCglpbnQgbTsKCWNpbj4+bTsgLy9udW1iZXIgb2YgZWRnZXMKCWludCBmcm9tLHRvOwoKCWZvciAoaW50IGk9MDsgaTxtOyBpKyspewogICAgICAgIGNpbj4+ZnJvbT4+dG87ICAvL2VkZ2VzCiAgICAgICAgQWxbZnJvbV0ucHVzaF9iYWNrKHRvKTsgICAvL0cKICAgICAgICBBbHJbdG9dLnB1c2hfYmFjayhmcm9tKTsgIC8vR190cmFuc3Bvc2UKCX0KCglmb3IgKGludCBpPTE7IGk8PW47IGkrKyl7CiAgICAgICAgaWYgKCF1c2VkW2ldKXsKICAgICAgICAgICAgZGZzMShpKTsgIC8vbWFyayB2ZXJ0aWNlcyBpbiBvcmRlciBvZiBmaW5pc2ggdGltZQogICAgICAgIH0KCX0KCglyZXZlcnNlKG9yZGVyLmJlZ2luKCksIG9yZGVyLmVuZCgpKTsKCW1lbXNldCh1c2VkLDAsc2l6ZW9mKHVzZWQpKTsKCglmb3IgKGludCBpPTA7IGk8b3JkZXIuc2l6ZSgpOyBpKyspeyAvL3RyYXZlcnNlIHZlcnRpY2VzIGluIGRlY3Jlc2luZyBvcmRlciBvZiBmaW5pc2ggdGltZQogICAgICAgIGlmICghdXNlZFtpXSl7CiAgICAgICAgICAgIG5vZGVzLmNsZWFyKCk7CiAgICAgICAgICAgIGRmczIob3JkZXJbaV0pOwogICAgICAgICAgICBjb21wb25lbnRzLnB1c2hfYmFjayhub2Rlcyk7CiAgICAgICAgfQoJfQoKCWZvciAoaW50IGk9MDsgaTxjb21wb25lbnRzLnNpemUoKTsgaSsrKXsKCSAgICBjb3V0PDwic2NjICI8PGkrMTw8IiAtPiAiOwogICAgICAgIGZvciAoaW50IGo9MDsgajxjb21wb25lbnRzW2ldLnNpemUoKTsgaisrKXsKICAgICAgICAgICAgY291dDw8Y29tcG9uZW50c1tpXVtqXTw8IiAiOwogICAgICAgIH0KICAgICAgICBjb3V0PDwiXG4iOwoJfQoKfQo=