```cpp
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cstring>
#include <bitset>
#include <vector>
using namespace std;
#define S 2000005
#define MS 1000005
#define ckjjyn 36505
int n,m;
int esum,to[S],nxt[S],h[MS];
int esum2,to2[S],nxt2[S],h2[MS];
int cnt,dfn[MS],low[MS];
int top,sta[MS];
bool vis[MS];
int tot,who[MS];
vector<int> has[MS];
int ind[MS],dp[MS];
bool canto[MS];
inline void add(int x,int y)
{
to[++esum]=y;
nxt[esum]=h[x];
h[x]=esum;
}
inline void add2(int x,int y)
{
to2[++esum2]=y;
nxt2[esum2]=h2[x];
h2[x]=esum2;
}
void tarjan(int u)
{
low[u]=dfn[u]=++cnt;
vis[u]=true;
sta[++top]=u;
for(int i=h[u];i;i=nxt[i])
{
int v=to[i];
if(dfn[v]==0)
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
tot++;
while(1)
{
has[tot].push_back(sta[top]);
who[sta[top]]=tot;
vis[sta[top]]=false;
if(sta[top--]==u)
{
break;
}
}
}
}
inline void slove()
{
for(int i=1;i<=n+1;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
for(int u=1;u<=n+1;u++)
{
for(int i=h[u];i;i=nxt[i])
{
int v=to[i];
if(who[u]!=who[v])
{
add2(who[u],who[v]);
ind[who[v]]++;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(y,x);
}
slove();
dp[who[n+1]]=1;
canto[who[n+1]]=true;
queue<int> q;
for(int i=1;i<=tot;i++)
{
if(ind[i]==0)
{
q.push(i);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
if(has[u].size()>=2)
{
dp[u]=ckjjyn;
}
for(int i=h2[u];i;i=nxt2[i])
{
int v=to2[i];
dp[v]=min(dp[v]+dp[u],ckjjyn);
canto[v]|=canto[u];
if(!--ind[v])
{
q.push(v);
}
}
}
int ans=0;
for(int i=1;i<=tot;i++)
{
if(canto[i])
{
ans=max(ans,dp[i]);
}
}
vector<int> v;
if(ans>=ckjjyn)
{
puts("zawsze");
for(int i=1;i<=tot;i++)
{
if(dp[i]>=ckjjyn&&canto[i])
{
for(int j=0;j<has[i].size();j++)
{
v.push_back(has[i][j]);
}
}
}
}
else
{
printf("%d\n",ans);
for(int i=1;i<=tot;i++)
{
if(dp[i]==ans&&canto[i])
{
for(int j=0;j<has[i].size();j++)
{
v.push_back(has[i][j]);
}
}
}
}
sort(v.begin(),v.end());
printf("%d\n",v.size());
for(int i=0;i<v.size();i++)
{
printf("%d ",v[i]);
}
printf("\n");
return 0;
}
```
by lovely_ckj @ 2021-09-15 16:53:12