#include <iostream>
using namespace std;
const int NMAX = 15;
struct node {
int info;
node* next;
};
void add(node* &first, int val) {
node* p = new node;
p -> info = val;
p -> next = first;
first = p;
}
void read(int& n, int& m, node* G[NMAX], node* Gt[NMAX]) {
cin >> n >> m;
for (int i = 1; i <= m; ++ i) {
int x, y;
cin >> x >> y;
add(G[x], y);
add(Gt[y], x);
}
}
void dfs1(node* G[NMAX], int currNode, bool seen[NMAX], int stck[NMAX], int& dim) {
seen[currNode] = true;
for (node* p = G[currNode]; p; p = p -> next)
if (!seen[p -> info])
dfs1(G, p -> info, seen, stck, dim);
stck[++ dim] = currNode;
}
void dfs2(node* Gt[NMAX], int currNode, bool seen[NMAX], int idx) {
seen[currNode] = true;
// prelucrare nodul cnt din componenta idx
cout << currNode << " ";
for (node* p = Gt[currNode]; p; p = p -> next)
if (!seen[p -> info])
dfs2(Gt, p -> info, seen, idx);
}
void solve(int n, node* G[NMAX], node* Gt[NMAX]) {
bool seen[NMAX];
int stck[NMAX], dim = 0;
for (int i = 1; i <= n; ++ i)
seen[i] = false;
for (int i = 1; i <= n; ++ i)
if (!seen[i])
dfs1(G, i, seen, stck, dim);
int idx = 0;
for (int i = 1; i <= n; ++ i)
seen[i] = false;
while (dim) {
if (!seen[stck[dim]]) {
++ idx;
cout << idx << " ";
dfs2(Gt, stck[dim], seen, idx);
cout << "\n";
}
-- dim;
}
}
int main() {
int n, m;
node* G[NMAX];
node* Gt[NMAX];
read(n, m, G, Gt);
solve(n, G, Gt);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOTUFYID0gMTU7CgpzdHJ1Y3Qgbm9kZSB7CiAgICBpbnQgaW5mbzsKICAgIG5vZGUqIG5leHQ7Cn07Cgp2b2lkIGFkZChub2RlKiAmZmlyc3QsIGludCB2YWwpIHsKICAgIG5vZGUqIHAgPSBuZXcgbm9kZTsKICAgIHAgLT4gaW5mbyA9IHZhbDsKICAgIHAgLT4gbmV4dCA9IGZpcnN0OwogICAgZmlyc3QgPSBwOwp9Cgp2b2lkIHJlYWQoaW50JiBuLCBpbnQmIG0sIG5vZGUqIEdbTk1BWF0sIG5vZGUqIEd0W05NQVhdKSB7CiAgICBjaW4gPj4gbiA+PiBtOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgKysgaSkgewogICAgICAgIGludCB4LCB5OwogICAgICAgIGNpbiA+PiB4ID4+IHk7CiAgICAgICAgYWRkKEdbeF0sIHkpOwogICAgICAgIGFkZChHdFt5XSwgeCk7CiAgICB9Cn0KCnZvaWQgZGZzMShub2RlKiBHW05NQVhdLCBpbnQgY3Vyck5vZGUsIGJvb2wgc2VlbltOTUFYXSwgaW50IHN0Y2tbTk1BWF0sIGludCYgZGltKSB7CiAgICBzZWVuW2N1cnJOb2RlXSA9IHRydWU7CiAgICBmb3IgKG5vZGUqIHAgPSBHW2N1cnJOb2RlXTsgcDsgcCA9IHAgLT4gbmV4dCkKICAgICAgICBpZiAoIXNlZW5bcCAtPiBpbmZvXSkKICAgICAgICAgICAgZGZzMShHLCBwIC0+IGluZm8sIHNlZW4sIHN0Y2ssIGRpbSk7CiAgICBzdGNrWysrIGRpbV0gPSBjdXJyTm9kZTsKfQoKdm9pZCBkZnMyKG5vZGUqIEd0W05NQVhdLCBpbnQgY3Vyck5vZGUsIGJvb2wgc2VlbltOTUFYXSwgaW50IGlkeCkgewogICAgc2VlbltjdXJyTm9kZV0gPSB0cnVlOwogICAgLy8gcHJlbHVjcmFyZSBub2R1bCBjbnQgZGluIGNvbXBvbmVudGEgaWR4CiAgICBjb3V0IDw8IGN1cnJOb2RlIDw8ICIgIjsKICAgIGZvciAobm9kZSogcCA9IEd0W2N1cnJOb2RlXTsgcDsgcCA9IHAgLT4gbmV4dCkKICAgICAgICBpZiAoIXNlZW5bcCAtPiBpbmZvXSkKICAgICAgICAgICAgZGZzMihHdCwgcCAtPiBpbmZvLCBzZWVuLCBpZHgpOwp9Cgp2b2lkIHNvbHZlKGludCBuLCBub2RlKiBHW05NQVhdLCBub2RlKiBHdFtOTUFYXSkgewogICAgYm9vbCBzZWVuW05NQVhdOwogICAgaW50IHN0Y2tbTk1BWF0sIGRpbSA9IDA7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArKyBpKQogICAgICAgIHNlZW5baV0gPSBmYWxzZTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsrIGkpCiAgICAgICAgaWYgKCFzZWVuW2ldKQogICAgICAgICAgICBkZnMxKEcsIGksIHNlZW4sIHN0Y2ssIGRpbSk7CgogICAgaW50IGlkeCA9IDA7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArKyBpKQogICAgICAgIHNlZW5baV0gPSBmYWxzZTsKICAgIHdoaWxlIChkaW0pIHsKICAgICAgICBpZiAoIXNlZW5bc3Rja1tkaW1dXSkgewogICAgICAgICAgICArKyBpZHg7CiAgICAgICAgICAgIGNvdXQgPDwgaWR4IDw8ICIgIjsKICAgICAgICAgICAgZGZzMihHdCwgc3Rja1tkaW1dLCBzZWVuLCBpZHgpOwogICAgICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICAgICAgfQogICAgICAgIC0tIGRpbTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiwgbTsKICAgIG5vZGUqIEdbTk1BWF07CiAgICBub2RlKiBHdFtOTUFYXTsKCXJlYWQobiwgbSwgRywgR3QpOwoJc29sdmUobiwgRywgR3QpOwoJcmV0dXJuIDA7Cn0K