//P2764
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5;
int n, m, hd[N], ln[N], eg[N], nx[N], tot, dep[N], now[N];
void adg(int x, int y){
eg[++tot] = y;
ln[tot] = 1;
nx[tot] = hd[x];
hd[x] = tot;
eg[++tot] = x;
ln[tot] = 0;
nx[tot] = hd[y];
hd[y] = tot;
}
bool bfs(int s, int t){
memset(dep, 0, sizeof(dep));
memcpy(now, hd, sizeof(hd));
queue<int> q;
dep[s] = 1;
q.push(s);
while(!q.empty()){
int x = q.front();
q.pop();
for(int i = hd[x]; i; i = nx[i]){
int y = eg[i], z = ln[i];
if(z && !dep[y]){
dep[y] = dep[x] + 1;
q.push(y);
if(y == t){
return true;
}
}
}
}
return false;
}
int dfs(int x, int t, int fl){
if(x == t){
return fl;
}
int rs = fl;
for(int i = now[x]; i; i = nx[i]){
int y = eg[i], z = ln[i];
if(z && dep[y] == dep[x] + 1){
int k = dfs(y, t, min(z, rs));
if(!k){
dep[y] = 0;
}
ln[i] -= k;
ln[i^1] += k;
rs -= k;
}
}
return fl - rs;
}
map<pair<int, int>, int> mp;
vector<int> g[N];
int ind[N], vis[N];
void solve(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i){
adg(0, i);
adg(i+n, n+n+1);
}
for(int i = 1; i <= m; ++ i){
int x, y;
scanf("%d%d", &x, &y);
mp[make_pair(x, y)] = tot + 1;
adg(x, y+n);
}
int mf = 0, tmp;
while(bfs(0, n+n+1)){
while(tmp = dfs(0, n+n+1, 1e9)){
mf += tmp;
}
}
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= n; ++ j){
int v = mp[make_pair(i, j)];
if(v && !ln[v]){
g[i].push_back(j);
++ ind[j];
}
}
}
for(int i = 1; i <= n; ++ i){
int p = i, flg = 0;
while(!vis[p] && !ind[p]){
flg = 1;
printf("%d ", p);
vis[p] = 1;
int tp = 0;
for(int j : g[p]){
-- ind[j];
if(!ind[j]){
tp = j;
}
}
if(!tp){
break;
}
p = tp;
}
if(flg) puts("");
}
printf("%d", n - mf);
}
int main(){
solve();
return 0;
}
//qwq
把权值改变的边提出来变成一张图 然后在图上拓扑