#include <iostream> #include <cstdio> #include <cstring> #define N 200005 using namespace std; int n, m, cnt; int head[N], ver[2*N], nxt[2*N], tot, num[N], v[N], w[N], f[N]; bool vis[N]; void add(int x, int y){ ver[++tot]=y, nxt[tot]=head[x], head[x]=tot; } void dfs(int x){ vis[x]=1, cnt++; for (int i=head[x]; i; i=nxt[i]){ int y=ver[i]; if(vis[y]) continue; dfs(y); } } void init(){ for (int i=1; i<=(int)2e5; i++){ if(!num[i]) continue; int s=1; while(s<=num[i]){ num[i]-=s; v[++cnt]=s*i; w[cnt]=s; s*=2; } if(num[i]){ v[++cnt]=num[i]*i; w[cnt]=num[i]; } // cout<<v[cnt]<<' '<<w[cnt]<<endl; } } int main(){ memset(f, 0x3f, sizeof f);f[0]=0; scanf("%d%d", &n, &m); for (int i=1; i<=m; i++){ int x, y;scanf("%d%d", &x, &y); add(x, y), add(y, x); } for (int i=1; i<=n; i++){ if(!vis[i]){ cnt=0;dfs(i); num[cnt]++; } } cnt=0;init(); for (int i=1; i<=cnt; i++){ for (int j=n; j>=v[i]; j--){ f[j]=min(f[j], f[j-v[i]]+w[i]); } } for (int i=1; i<=n; i++) printf("%d\n", f[i]!=0x3f3f3f3f?f[i]-1:-1); return 0; }