不想吐槽题目....
/*
K bulabula 算法(好像用哪个T bulabula更简单 然而我并不会 - -)
丑陋的处理cnt:
Printf时 cnt中 ans[i][0]==1 的删掉
然后更丑陋的处理强连通分量的出度 :
先把所包含的所有点f 成1 然后以每个点为起点跑一边 看看是不是出度指向本连通分量内的点
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
#define maxn 1010
using namespace std;
stack<int>s;
int out[maxn];
int ans[maxn][maxn],n,m,f[maxn],cnt,vis[maxn][maxn];
int head1[maxn],head2[maxn],num;
struct node
{
int u,v,per;
}e1[maxn],e2[maxn];
void Input()
{
cin>>n>>m;
int i,a,b;
for(i=1;i<=m;i++)
{
cin>>a>>b;
num++;
e1[num].u=a;
e1[num].v=b;
e1[num].per=head1[a];
head1[a]=num;
e2[num].u=b;
e2[num].v=a;
e2[num].per=head2[b];
head2[b]=num;
}
}
void Dfs1(int x)
{
int i;
f[x]=1;
for(i=head1[x];i;i=e1[i].per)
if(f[e1[i].v]==0)
Dfs1(e1[i].v);
s.push(x);
}
void Dfs2(int x)
{
ans[cnt][0]++;
ans[cnt][ans[cnt][0]]=x;
f[x]=1;
int i;
for(i=head2[x];i;i=e2[i].per)
if(f[e2[i].v]==0)
Dfs2(e2[i].v);
}
void Kosa()
{
int i;
for(i=1;i<=n;i++)
if(f[i]==0)
Dfs1(i);
memset(f,0,sizeof(f));
while(!s.empty())
{
int tmp=s.top();
s.pop();
if(f[tmp]==0)
{
cnt++;
Dfs2(tmp);
}
}
}
void Printf()//丑陋的处理....
{
int i,j,jian=0,tot=0,tmp[maxn],size;
for(i=1;i<=cnt;i++)
if(ans[i][0]==1)jian++;//只有一个节点的 --
cout<<cnt-jian<<endl;
for(i=1;i<=cnt;i++)
{
int flag=0;
if(ans[i][0]==1)continue;//只有一个节点的 pass
memset(f,0,sizeof(f));
for(j=1;j<=ans[i][0];j++)f[ans[i][j]]=1;
for(j=1;j<=ans[i][0];j++)
{
int k;
for(k=head1[ans[i][j]];k;k=e1[k].per)
if(f[e1[k].v]==0)
flag=1;
}
if(!flag)
{
tot++;
tmp[maxn]={0},size=0;
for(j=1;j<=ans[i][0];j++)//记下答案 并排序
tmp[++size]=ans[i][j];
sort(tmp+1,tmp+1+size);
}
}
if(tot!=1)cout<<-1;
else
{
for(j=1;j<=size;j++)
cout<<tmp[j]<<" ";
}
}
int main()
{
Input();
Kosa();
Printf();
}