Cod sursa(job #700094)
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
#define N 100003
using namespace std;
int n;
int nr;
int fol[N];
int minim[N];
bool viz[N];
vector < int > g[N];
vector < int > comp;
vector < vector < int > > ctc;
stack < int > s;
void citire()
{
freopen ("ctc.in", "r", stdin);
int m;
scanf ("%d %d ", &n, &m);
while (m --)
{
int x;
int y;
scanf ("%d %d ", &x, &y);
g[x].push_back (y);
}
}
void tarjan(int v)
{
s.push (v);
viz[v] = 1;
++ nr;
fol[v] = minim[v] = nr;
unsigned int m = g[v].size();
for (unsigned int i = 0; i < m; ++ i)
{
int vf = g[v][i];
if (fol[vf] == 0)
{
tarjan (vf);
minim[v] = min (minim[v], minim[vf]);
}
else if (viz[vf])
minim[v] = min (minim[v], minim[vf]);
}
if (fol[v] == minim[v])
{
comp.clear();
int nod;
do
{
nod = s.top();
s.pop();
viz[nod] = 0;
comp.push_back (nod);
}
while (nod != v);
ctc.push_back (comp);
}
}
void solve()
{
for (int i = 1; i <= n; ++ i)
if (fol[i] == 0)
tarjan (i);
}
void afisare()
{
freopen ("ctc.out", "w", stdout);
unsigned int nr_ctc = ctc.size();
printf ("%u\n", nr_ctc);
for (unsigned int i = 0; i < nr_ctc; ++ i)
{
unsigned int m = ctc[i].size();
for (unsigned int j = 0; j < m; ++ j)
printf ("%d ", ctc[i][j]);
printf ("\n");
}
}
int main()
{
citire();
solve();
afisare();
return 0;
}