#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2647"
#include<bits/stdc++.h>#define REP(i, n) for (int i = 0; i < (n); i++)
#include"library/graph/MinimumSpanningArborescence.hpp"
#include"library/graph/WeightedGraph.hpp"intmain(){intn,m;std::cin>>n>>m;std::vector<bool>koho(n,true);WeightedGraph<int>G(n);REP(_,m){inta,b;std::cin>>a>>b;koho[b]=false;G.add_arc(a,b,0);G.add_arc(b,a,1);}intmn=1e9;std::vector<int>ans;REP(i,n)if(koho[i]){autores=minimum_spanning_arborescence(G,i);assert(res.has_value());constauto&[val,tree]=res.value();if(mn==val)ans.push_back(i);if(mn>val){mn=val;ans={i};}}std::cout<<ans.size()<<" "<<mn<<"\n";REP(i,ans.size())std::cout<<ans[i]<<"\n "[i+1<ans.size()];}
#line 1 "test/AOJ/2647.test.cpp"
#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2647"
#include<bits/stdc++.h>#define REP(i, n) for (int i = 0; i < (n); i++)
#line 3 "library/datastructure/unionfind/UnionFind.hpp"
classUnionFind{intn,num;std::vector<int>sz,parent;public:UnionFind()=default;UnionFind(intn):n(n),num(n),sz(n,1),parent(n,0){std::iota(parent.begin(),parent.end(),0);}intleader(intx){assert(0<=xandx<n);return(x==parent[x]?x:parent[x]=leader(parent[x]));}boolsame(intx,inty){assert(0<=xandx<nand0<=yandy<n);returnleader(x)==leader(y);}boolmerge(intx,inty){assert(0<=xandx<nand0<=yandy<n);x=leader(x);y=leader(y);if(x==y)returnfalse;if(sz[x]<sz[y])std::swap(x,y);sz[x]+=sz[y];parent[y]=x;num--;returntrue;}intsize(constintx){assert(0<=xandx<n);returnsz[leader(x)];}intcount()const{returnnum;}std::vector<std::vector<int>>groups(){std::vector<std::vector<int>>res(n);for(inti=0;i<n;i++)res[leader(i)].push_back(i);std::erase_if(res,[](constauto&vec){returnvec.empty();});returnres;}};#line 3 "library/graph/MinimumSpanningArborescence.hpp"
template<typenameWG,typenameW=typenameWG::weight_type>std::optional<std::pair<W,std::vector<int>>>minimum_spanning_arborescence(WGg,intr=0){intn=g.n;Wres=0;std::vector<W>new_add(n,0);std::vector<int>tree(n),pre(n),state(n,0);UnionFinduf(n);state[r]=2;autocompare=[&](constint&a,constint&b){returng.edges[a].weight>g.edges[b].weight;};usingPQ=std::priority_queue<int,std::vector<int>,decltype(compare)>;std::vector<std::pair<PQ,W>>pq_add(n,{PQ{compare},0});for(inti=0;i<g.edges.size();i++)pq_add[g.edges[i].to].first.push(i);std::vector<int>pq_id(n);std::iota(pq_id.begin(),pq_id.end(),0);automerge=[&](intu,intv){u=uf.leader(u);v=uf.leader(v);if(u==v)return;uf.merge(u,v);auto&[pq1,add1]=pq_add[pq_id[u]];auto&[pq2,add2]=pq_add[pq_id[v]];if(pq1.size()>pq2.size()){while(pq2.size()){intedge_id=pq2.top();pq2.pop();g.edges[edge_id].weight-=add2-add1;pq1.push(edge_id);}pq_id[uf.leader(v)]=pq_id[u];}else{while(pq1.size()){intedge_id=pq1.top();pq1.pop();g.edges[edge_id].weight-=add1-add2;pq2.push(edge_id);}pq_id[uf.leader(v)]=pq_id[v];}};for(inti=0;i<n;i++){intnow=uf.leader(i);if(state[now])continue;std::vector<int>processing;while(state[now]!=2){processing.push_back(now);state[now]=1;auto&[pq,add]=pq_add[pq_id[now]];if(!pq.size())returnstd::nullopt;intedge_id=pq.top();pq.pop();auto&e=g.edges[edge_id];res+=e.weight-add;tree[e.to]=edge_id;pre[now]=uf.leader(e.from);new_add[now]=e.weight;if(state[pre[now]]==1){intv=now;do{pq_add[pq_id[v]].second=new_add[v];merge(v,now);v=uf.leader(pre[v]);}while(!uf.same(v,now));now=uf.leader(now);}elsenow=uf.leader(pre[now]);}for(intv:processing)state[v]=2;}tree.erase(tree.begin()+r);returnstd::make_pair(res,tree);}#line 2 "library/graph/WeightedGraph.hpp"
template<typenameT>structWeightedEdge{WeightedEdge()=default;WeightedEdge(intfrom,intto,Tweight):from(from),to(to),weight(weight){}intfrom,to;Tweight;operatorint()const{returnto;}};template<typenameT>structWeightedGraph{intn;usingweight_type=T;usingedge_type=WeightedEdge<T>;std::vector<edge_type>edges;protected:std::vector<int>in_deg;boolprepared;classOutgoingEdges{WeightedGraph*g;intl,r;public:OutgoingEdges(WeightedGraph*g,intl,intr):g(g),l(l),r(r){}edge_type*begin(){return&(g->edges[l]);}edge_type*end(){return&(g->edges[r]);}edge_type&operator[](inti){returng->edges[l+i];}intsize()const{returnr-l;}};classConstOutgoingEdges{constWeightedGraph*g;intl,r;public:ConstOutgoingEdges(constWeightedGraph*g,intl,intr):g(g),l(l),r(r){}constedge_type*begin()const{return&(g->edges[l]);}constedge_type*end()const{return&(g->edges[r]);}constedge_type&operator[](inti)const{returng->edges[l+i];}intsize()const{returnr-l;}};public:OutgoingEdgesoperator[](intv){assert(prepared);return{this,in_deg[v],in_deg[v+1]};}constConstOutgoingEdgesoperator[](intv)const{assert(prepared);return{this,in_deg[v],in_deg[v+1]};}boolis_prepared()const{returnprepared;}WeightedGraph():n(0),in_deg(1,0),prepared(false){}WeightedGraph(intn):n(n),in_deg(n+1,0),prepared(false){}WeightedGraph(intn,intm,booldirected=false,intindexed=1):n(n),in_deg(n+1,0),prepared(false){scan(m,directed,indexed);}voidresize(intn){n=n;}voidadd_arc(intfrom,intto,Tweight){assert(!prepared);assert(0<=fromandfrom<nand0<=toandto<n);edges.emplace_back(from,to,weight);in_deg[from+1]++;}voidadd_edge(intu,intv,Tweight){add_arc(u,v,weight);add_arc(v,u,weight);}voidadd_arc(constedge_type&e){add_arc(e.from,e.to,e.weight);}voidadd_edge(constedge_type&e){add_edge(e.from,e.to,e.weight);}voidscan(intm,booldirected=false,intindexed=1){edges.reserve(directed?m:2*m);while(m--){intu,v;std::cin>>u>>v;u-=indexed;v-=indexed;Tweight;std::cin>>weight;if(directed)add_arc(u,v,weight);elseadd_edge(u,v,weight);}build();}voidbuild(){assert(!prepared);prepared=true;for(intv=0;v<n;v++)in_deg[v+1]+=in_deg[v];std::vector<edge_type>new_edges(in_deg.back());autocounter=in_deg;for(auto&&e:edges)new_edges[counter[e.from]++]=e;edges=new_edges;}voidgraph_debug()const{#ifndef __DEBUG
return;#endif
assert(prepared);for(intfrom=0;from<n;from++){std::cerr<<from<<";";for(inti=in_deg[from];i<in_deg[from+1];i++)std::cerr<<"("<<edges[i].to<<","<<edges[i].weight<<")";std::cerr<<"\n";}}};#line 8 "test/AOJ/2647.test.cpp"
intmain(){intn,m;std::cin>>n>>m;std::vector<bool>koho(n,true);WeightedGraph<int>G(n);REP(_,m){inta,b;std::cin>>a>>b;koho[b]=false;G.add_arc(a,b,0);G.add_arc(b,a,1);}intmn=1e9;std::vector<int>ans;REP(i,n)if(koho[i]){autores=minimum_spanning_arborescence(G,i);assert(res.has_value());constauto&[val,tree]=res.value();if(mn==val)ans.push_back(i);if(mn>val){mn=val;ans={i};}}std::cout<<ans.size()<<" "<<mn<<"\n";REP(i,ans.size())std::cout<<ans[i]<<"\n "[i+1<ans.size()];}