#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]=i; c<<=1; } w[++cx]=a[i]*i; v[++cx]=a[i]; } // puts("ylcccx"); memset(f,0x3f,sizeof f);f[0]=-1; // for(int i=1;i<=n;i++)for(int k=1;k<=a[i];k++)for(int j=n;j>=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; }