#include #define ll long long using namespace std; const int N=3e5+5,M=6e5+5; int n,m,uu[M],vv[M]; struct Edge{int v,id;}; vectorG[N]; bool mark[M]; struct State{int u,id;}; vectorstk; bool ins[N]; bool vis[M]; void dfs(int u,int p){ stk.push_back({u,p}),ins[u]=1; for(auto e:G[u]){ int v=e.v,id=e.id; if(vis[id])continue; vis[id]=1; if(!ins[v])dfs(v,id); else{ mark[id]=1; while(!stk.empty()&&stk.back().u!=v)mark[stk.back().id]=1,ins[stk.back().u]=0,stk.pop_back(); } } if(!stk.empty())ins[stk.back().u]=0,stk.pop_back(); } //int in[N]; //int fin[N]; signed main() { freopen("dag.in","r",stdin),freopen("dag.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++)scanf("%d%d",uu+i,vv+i),G[uu[i]].push_back({vv[i],i}); for(int i=1;i<=n;i++){ while(!stk.empty())ins[stk.back().u]=0,stk.pop_back(); dfs(i,0); } int cnt=0; vectorans; for(int i=1;i<=m;i++)if(!mark[i])cnt++,ans.push_back(i); printf("%d %d\n",n,cnt); for(int it:ans)printf("%d %d\n",uu[it],vv[it]); return 0; }