#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=41111;
//-----Tarjan
vector<int> G[maxn];
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int> S;
void dfs(int u)
{
pre[u]=lowlink[u]=++dfs_clock;
S.push(u);
int len=G[u].size();
for (int i=0;i<len;i++)
{
int v=G[u][i];
if (!pre[v])
{
dfs(v);
lowlink[u]=min( lowlink[u], lowlink[v] );
}
else if (!sccno[v])
{
lowlink[u]=min( lowlink[u], pre[v] );
}
}
if (lowlink[u]==pre[u])
{
scc_cnt++;
while (true)
{
int x=S.top();
S.pop();
sccno[x]=scc_cnt;
if (x==u) break;
}
}
}
void find_scc(int n)
{
dfs_clock=scc_cnt=0;
memset(sccno,0,sizeof(sccno));
memset(pre,0,sizeof(pre));
for (int i=0;i<n;i++)
{
if (!pre[i]) dfs(i);
}
}
//-----------