#pragma GCC optimize("O3") #include using namespace std; using ll=long long; using lll=__int128_t; using P=pair; template using V=vector; #define fi first #define se second #define all(v) (v).begin(),(v).end() const ll inf=(1e18); //const ll mod=998244353; const ll mod=1000000007; const vector dy={-1,0,1,0},dx={0,-1,0,1}; ll GCD(ll a,ll b) {return b ? GCD(b,a%b):a;} ll LCM(ll c,ll d){return c/GCD(c,d)*d;} struct __INIT{__INIT(){cin.tie(0);ios::sync_with_stdio(false);cout< bool chmax(T &a, const T &b) { if (a bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; } templatevoid debag(const vector &a){cerr<<"debag :";for(auto v:a)cerr<void print(const vector &a){for(auto v:a)cout<sputn(d, len) != len) {dest.setstate(std::ios_base::badbit);}} return dest;} class UF{ public: vector par,num; int find(int v){ return (par[v]==v)? v: (par[v]=find(par[v])); } explicit UF(){} explicit UF(int N):par(N),num(N,1){ iota(all(par),0); } void init(int N){ par.assign(N,0); num.assign(N,1); iota(all(par),0); } void unite(int u,int v){ u=find(u),v=find(v); if(u==v)return; if(num[u] > G; vector deg,res; tposort(int node_size):n(node_size), G(n), deg(n, 0){} void add_edge(int from,int to){ G[from].push_back(to); deg[to]++; } bool solve(){ queue q; for(int i = 0; i < n; i++){ if(deg[i] == 0){ q.push(i); } } while(!q.empty()){ int cur = q.front(); q.pop(); res.push_back(cur); for(int v :G[cur]){ if(--deg[v]==0){ q.push(v); } } } return (*max_element(deg.begin(),deg.end()) == 0); } }; int main(){ int n,m; cin>>n>>m; UF uf(n); V

a(m); for(int i=0;i>a[i].fi>>a[i].se; a[i].fi--;a[i].se--; uf.unite(a[i].fi,a[i].se); } V> d(n); for(int i=0;i id(n); V

ans; V used(n,false); for(int i=0;i> g(cnt),tmp; V rid(cnt); for(auto &p:d[i]){ rid[id[p.fi]]=p.fi+1;rid[id[p.se]]=p.se+1; g[id[p.fi]].emplace_back(id[p.se]); } tposort tp(cnt); for(int j=0;j