#include using namespace std; long long readInt(long long l,long long r,char endd){ long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true){ char g=getchar(); if(g=='-'){ assert(fi==-1); is_neg=true; continue; } if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd){ assert(cnt>0); if(is_neg){ x= -x; } assert(l<=x && x<=r); return x; } else { assert(false); } } } string readString(int l,int r,char endd){ string ret=""; int cnt=0; while(true){ char g=getchar(); assert(g!=-1); if(g==endd){ break; } cnt++; ret+=g; } assert(l<=cnt && cnt<=r); return ret; } long long readIntSp(long long l,long long r){ return readInt(l,r,' '); } long long readIntLn(long long l,long long r){ return readInt(l,r,'\n'); } string readStringLn(int l,int r){ return readString(l,r,'\n'); } string readStringSp(int l,int r){ return readString(l,r,' '); } const int NMAX = 1000000 + 5; vector graph[NMAX]; int deg[NMAX]; int main() { int N, M; N = readIntSp(1, 1000000); M = readIntLn(1, 1000000); for (int i = 1; i <= M; ++i) { int a = readIntSp(1, N); int b = readIntLn(1, N); assert(a != b); graph[b].push_back(a); ++deg[a]; } assert(getchar() == -1); priority_queue > q; for (int i = 1; i <= N; ++i) { if (deg[i] == 0) { q.push(make_pair(graph[i].size(), i)); } } vector > sol; int cnt = 0; while (!q.empty()) { vector step = {q.top().second}; q.pop(); cnt += 1; if (q.size() >= 1) { step.push_back(q.top().second); q.pop(); cnt += 1; } sol.push_back(step); for (auto it: step) { for (auto son: graph[it]) { --deg[son]; if (deg[son] == 0) { q.push(make_pair(graph[son].size(), son)); } } } } assert(cnt == N); cout << sol.size() << endl; for (const auto v: sol) { cout << v.size(); for (auto it: v) cout << ' ' << it; cout << '\n'; } return 0; }