#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;
}