#include <iostream>
using namespace std;
const int NMAX = 15;
struct node {
int info;
node* next;
};
node* G[NMAX];
node* Gt[NMAX];
void add(node* &first, int val) {
node* p = new node;
p -> info = val;
p -> next = first;
first = p;
}
void read(int& n, int& m) {
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(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(p -> info, seen, stck, dim);
stck[++ dim] = currNode;
}
void dfs2(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(p -> info, seen, idx);
}
void solve(int n) {
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(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(stck[dim], seen, idx);
cout << "\n";
}
-- dim;
}
}
int main() {
int n, m;
read(n, m);
solve(n);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOTUFYID0gMTU7CgpzdHJ1Y3Qgbm9kZSB7CiAgICBpbnQgaW5mbzsKICAgIG5vZGUqIG5leHQ7Cn07Cgpub2RlKiBHW05NQVhdOwpub2RlKiBHdFtOTUFYXTsKCnZvaWQgYWRkKG5vZGUqICZmaXJzdCwgaW50IHZhbCkgewogICAgbm9kZSogcCA9IG5ldyBub2RlOwogICAgcCAtPiBpbmZvID0gdmFsOwogICAgcCAtPiBuZXh0ID0gZmlyc3Q7CiAgICBmaXJzdCA9IHA7Cn0KCnZvaWQgcmVhZChpbnQmIG4sIGludCYgbSkgewogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07ICsrIGkpIHsKICAgICAgICBpbnQgeCwgeTsKICAgICAgICBjaW4gPj4geCA+PiB5OwogICAgICAgIGFkZChHW3hdLCB5KTsKICAgICAgICBhZGQoR3RbeV0sIHgpOwogICAgfQp9Cgp2b2lkIGRmczEoaW50IGN1cnJOb2RlLCBib29sIHNlZW5bTk1BWF0sIGludCBzdGNrW05NQVhdLCBpbnQmIGRpbSkgewogICAgc2VlbltjdXJyTm9kZV0gPSB0cnVlOwogICAgZm9yIChub2RlKiBwID0gR1tjdXJyTm9kZV07IHA7IHAgPSBwIC0+IG5leHQpCiAgICAgICAgaWYgKCFzZWVuW3AgLT4gaW5mb10pCiAgICAgICAgICAgIGRmczEocCAtPiBpbmZvLCBzZWVuLCBzdGNrLCBkaW0pOwogICAgc3Rja1srKyBkaW1dID0gY3Vyck5vZGU7Cn0KCnZvaWQgZGZzMihpbnQgY3Vyck5vZGUsIGJvb2wgc2VlbltOTUFYXSwgaW50IGlkeCkgewogICAgc2VlbltjdXJyTm9kZV0gPSB0cnVlOwogICAgLy8gcHJlbHVjcmFyZSBub2R1bCBjbnQgZGluIGNvbXBvbmVudGEgaWR4CiAgICBjb3V0IDw8IGN1cnJOb2RlIDw8ICIgIjsKICAgIGZvciAobm9kZSogcCA9IEd0W2N1cnJOb2RlXTsgcDsgcCA9IHAgLT4gbmV4dCkKICAgICAgICBpZiAoIXNlZW5bcCAtPiBpbmZvXSkKICAgICAgICAgICAgZGZzMihwIC0+IGluZm8sIHNlZW4sIGlkeCk7Cn0KCnZvaWQgc29sdmUoaW50IG4pIHsKICAgIGJvb2wgc2VlbltOTUFYXTsKICAgIGludCBzdGNrW05NQVhdLCBkaW0gPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKysgaSkKICAgICAgICBzZWVuW2ldID0gZmFsc2U7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArKyBpKQogICAgICAgIGlmICghc2VlbltpXSkKICAgICAgICAgICAgZGZzMShpLCBzZWVuLCBzdGNrLCBkaW0pOwoKICAgIGludCBpZHggPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKysgaSkKICAgICAgICBzZWVuW2ldID0gZmFsc2U7CiAgICB3aGlsZSAoZGltKSB7CiAgICAgICAgaWYgKCFzZWVuW3N0Y2tbZGltXV0pIHsKICAgICAgICAgICAgKysgaWR4OwogICAgICAgICAgICBjb3V0IDw8IGlkeCA8PCAiICI7CiAgICAgICAgICAgIGRmczIoc3Rja1tkaW1dLCBzZWVuLCBpZHgpOwogICAgICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICAgICAgfQogICAgICAgIC0tIGRpbTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiwgbTsKCXJlYWQobiwgbSk7Cglzb2x2ZShuKTsKCXJldHVybiAwOwp9Cg==