#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++) using namespace std; typedef long long int ll; typedef vector VI; typedef vector VL; typedef pair PI; const ll mod = 1e9 + 7; const int N = 100010; VI qf[N]; // QuickFind int rt[N]; const int B = 500; int dp[B][N]; const int inf = 1e8; void solve(const vector &bag) { assert (bag.size() < B); REP(i, 0, B) { REP(j, 0, N) { dp[i][j] = inf; } } dp[0][0] = 0; REP(i, 1, bag.size() + 1) { PI cur = bag[i - 1]; REP(j, 0, N) { int res = dp[i - 1][j]; if (j >= cur.first) { res = min(res, dp[i - 1][j - cur.first] + cur.second); } dp[i][j] = res; } } } int main(void){ int n, m; cin >> n >> m; REP(i, 0, n) { qf[i].push_back(i); rt[i] = i; } REP(i, 0, m) { int u, v; cin >> u >> v; u--, v--; if (rt[u] != rt[v]) { int ru = rt[u]; int rv = rt[v]; if (qf[ru].size() < qf[rv].size()) { swap(ru, rv); } REP(j, 0, qf[rv].size()) { qf[ru].push_back(qf[rv][j]); rt[qf[rv][j]] = ru; } qf[rv].clear(); } } map cons; REP(i, 0, n) { int s = qf[i].size(); if (s != 0) { if (cons.count(s) == 0) { cons[s] = 0; } cons[s]++; } } vector bag; for (map::iterator it = cons.begin(); it != cons.end(); ++it) { int p = it->first; int q = it->second; int v = 1; while (v < q) { bag.push_back(PI(p * v, v)); q -= v; v *= 2; } if (q > 0) { bag.push_back(PI(p * q, q)); } } solve(bag); REP(i, 1, n + 1) { int res = dp[bag.size()][i]; cout << (res == inf ? -1 : res - 1) << endl; } }