#include using namespace std; typedef long long ll; typedef vector vi; typedef vector vl; typedef complex P; typedef pair pii; #define REP(i,n) for(ll i=0;i> n >> m; UF uf(n); REP(i,m){ int u,v; cin>>u>>v; --u;--v; uf.unite(u,v); } map szs; REP(i,n){ if(uf.root(i)==i) szs[uf.size(i)]+=1; } vl dp(n+1,1e18); dp[0] = -1; map::iterator iter2; iter2 = szs.begin(); while(iter2!=szs.end()){ ll num = iter2->first; ll cnt = iter2->second; ++iter2; // 2の累乗ごとにステップすると良い(らしい) // 3のステップが欲しい場合は、1のステップの結果を2のステップで飛ばせば良い for(ll i=0;cnt>0;++i){ ll t = min((ll)1<