#include #pragma GCC optimize("O3,Ofast") using namespace std; const int N=1e5+5,M=4e5+5; int head[N],cnt;struct node{int nxt,to;}g[M]; void add(int u,int v){g[++cnt]={head[u],v};head[u]=cnt;} int n,m,a[N],siz,f[N];bool vis[N]; void dfs(int u){ ++siz;vis[u]=1; for(int i=head[u];i;i=g[i].nxt){ int v=g[i].to; if(vis[v]) continue; dfs(v); } } int cx,w[N],v[N]; signed main(){ scanf("%d%d",&n,&m); for(int i=1,u,v;i<=m;i++){ scanf("%d%d",&u,&v); add(u,v);add(v,u); } for(int i=1;i<=n;i++)if(!vis[i]){ siz=0; dfs(i); ++a[siz]; } for(int i=1;i<=n;i++)if(a[i]){ int c=1; while(a[i]>c){ a[i]-=c; w[++cx]=i*c; v[cx]=c; c<<=1; } if(a[i]){ w[++cx]=a[i]*i; v[cx]=a[i]; } } // for(int i=1;i<=cx;i++) cout<=i*k;j--) // f[j]=min(f[j],f[j-i*k]+1); for(int i=1;i<=cx;i++)for(int j=n;j>=w[i];j--) f[j]=min(f[j],f[j-w[i]]+v[i]); for(int i=1;i<=n;i++) if(f[i]>1e9) puts("-1"); else printf("%d\n",f[i]); return 0; }