1 #include<iostream>
2 #include<string>
3 #include<queue>
4 #include<stack>
5 #include<vector>
6 #include<map>
7 #include<cstdio>
8 #include<cstdlib>
9 #include<algorithm>
10 #include<set>
11 #include<list>
12 #include<iomanip>
13 #include<cstring>
14 #include<cmath>
15 #include<limits>
16 #include<fstream>
17 using namespace std;
18
19 template<typename type>
20 inline type min(type& a, type& b)
21 {
22 return a < b ? a : b;
23 }
24
25 template<typename type>
26 inline type max(type& a, type& b)
27 {
28 return a > b ? a : b;
29 }
30
31 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
32 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
33 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
34 #define lll __int128
35 #define Re register
36 #define mem(a,b) memset(a,(b),sizeof(a))
37 typedef pair<int, int> intpair;
38 typedef pair<long long int, long long int> llpair;
39 typedef long long int ll;
40 const int INF = 0x3f3f3f3f;
41 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
42
43 const int maxn = 100010;
44 int d[maxn];
45 int now[maxn];
46 const int st = 100008, ed = 100009;
47 int n, m;
48 int ans[maxn];
49 int to[maxn];
50 bool tag[maxn];
51 int cnt;
52 bool vis[maxn];
53
54 struct Edge
55 {
56 int v, nxt;
57 int w;
58 }e[maxn];
59
60 int head[maxn];
61
62 void add_dinic(int u, int v)
63 {
64 e[++cnt].v = v;
65 e[cnt].w = 0;
66 e[cnt].nxt = head[u];
67 head[u] = cnt;
68 }
69
70 void add(int u, int v, int w)
71 {
72 e[++cnt].v = v;
73 e[cnt].nxt = head[u];
74 head[u] = cnt;
75 e[cnt].w = w;
76 add_dinic(v, u);
77 }
78
79 int dfs_dinic(int x, int flow)
80 {
81 if (x == ed) return flow;
82 int res = 0;
83 for (int i = now[x]; i != -1; i = e[i].nxt)
84 {
85 int v = e[i].v;
86 now[x] = i;
87 if (d[v] + 1 == d[x] && e[i].w > 0)
88 {
89 int k = dfs_dinic(v, min(e[i].w, flow));
90 if (k > 0 && x != st)
91 {
92 tag[x] = true;
93 to[x] = v - n;
94 }
95 res += k;
96 flow -= k;
97 e[i].w -= k;
98 e[i ^ 1].w += k;
99 if (!flow) break;
100 }
101 }
102 return res;
103 }
104
105 bool bfs_dinic()
106 {
107 memset(d, 0, sizeof(d));
108 queue<int>q;
109 q.push(ed);
110 d[ed] = 1;
111 while (!q.empty())
112 {
113 int u = q.front();
114 q.pop();
115 for (int i = head[u]; i != -1; i = e[i].nxt)
116 {
117 int v = e[i].v;
118 if (!d[v] && e[i ^ 1].w > 0)
119 {
120 q.push(v);
121 d[v] = d[u] + 1;
122 }
123 }
124 }
125 return d[st];
126 }
127
128
129 int dinic()
130 {
131 int flow = 0;
132 while (bfs_dinic())
133 {
134 for (int i = 0; i <= ed; i++) now[i] = head[i];
135 flow += dfs_dinic(st, INF);
136 }
137 return flow;
138 }
139
140 int main()
141 {
142 cnt = 1;
143 memset(head, -1, sizeof(head));
144 cin >> n >> m;
145 mfor(i, 1, n)
146 {
147 add(st, i, 1);
148 add(i + n, ed, 1);
149 }
150 mfor(i, 1, m)
151 {
152 int a, b;
153 cin >> a >> b;
154 add(a, b + n, 1);
155 }
156 int maxf = dinic();
157 mfor(i, 1, n)
158 if (tag[i] && !vis[i])
159 {
160 int now = i;
161 vis[i] = true;
162 cout << now << " ";
163 while (to[now] && to[now] != ed)
164 {
165 cout << to[now] << " ";
166 vis[to[now]] = true;
167 now = to[now];
168 }
169 cout << endl;
170 }
171 cout << n - maxf << endl;
172 }