#include <algorithm>
#include <ctime>
#include <cmath>
#include <string>
#include <memory>
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
const int maxn = 100000 + 5;
const int maxm = 2000000 + 5;
typedef unsigned int uint;
typedef long long int64;
typedef unsigned long long uint64;
template <class T> inline T Sqr(const T & x) { return x * x; }
template <class T> inline T Abs(const T & x) { return x > 0 ? x : -x; }
template <class T> inline T Min(const T & a, const T & b) { return a < b ? a : b; }
template <class T> inline T Max(const T & a, const T & b) { return a > b ? a : b; }
template <class T> inline T Ksm(const T & a, const T & b, const T & m) { T _ = 1; for (; b; b >>= 1, a = a * a % m) (b & 1) ? _ = _ * a % m : 0; return _ % m; }
template <class T> inline void Swap(T & a, T & b) { T _; _ = a; a = b; b = _; }
typedef int pint[maxn * 2];
typedef int eint[maxm * 2];
int n, m, e(1), ans, num[maxm], dfn;
pint edge, vp, vps, pre, suc, aps;
eint next, point, s;
inline void link(int u, int v)
{
point[++e] = v; next[e] = edge[u]; edge[u] = e;
point[++e] = u; next[e] = edge[v]; edge[v] = e;
}
inline int getint()
{
char ch = getchar(); int result = 0;
for (; '0' > ch || ch > '9'; ch = getchar());
for (; '0' <= ch && ch <= '9'; )
result = result * 10 + ch - '0', ch = getchar();
return result;
}
void init()
{
n = getint(), m = getint();
for (int i = 1, u, v; i <= m; ++i)
link(u = getint(), v = getint());
for (int i = 0; i <= n; ++i)
pre[i] = i - 1, suc[i] = i + 1;
pre[0] = n, suc[n] = 0;
}
void bfs()
{
int l, r, res;
for (l = r = res = 1, s[l] = suc[0]; l <= r; ++l)
{
aps[s[l]] = 1, vp[s[l]] = ++dfn, pre[suc[s[l]]] = pre[s[l]], suc[pre[s[l]]] = suc[s[l]];
for (int i = edge[s[l]]; i; i = next[i]) vp[point[i]] = dfn;
for (int i = suc[0]; i; i = suc[i])
if (!aps[i] && vp[i] != dfn)
{
s[++r] = i, aps[i] = 1;
pre[suc[i]] = pre[i], suc[pre[i]] = suc[i];
if (!vps[i]) ++res, vps[i] = 1;
}
}
num[ans + 1] = res;
}
void newgraph()
{
for (; suc[0]; bfs(), ++ans);
sort(num + 1, num + ans + 1);
printf("%d\n", ans);
for (int i = 1; i <= ans; ++i)
printf("%d ", num[i]);
}
int main()
{
init();
newgraph();
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4biA9IDEwMDAwMCArIDU7CmNvbnN0IGludCBtYXhtID0gMjAwMDAwMCArIDU7Cgp0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50Owp0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0OwoKdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBUIFNxcihjb25zdCBUICYgeCkgeyByZXR1cm4geCAqIHg7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBUIEFicyhjb25zdCBUICYgeCkgeyByZXR1cm4geCA+IDAgPyB4IDogLXg7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBUIE1pbihjb25zdCBUICYgYSwgY29uc3QgVCAmIGIpIHsgcmV0dXJuIGEgPCBiID8gYSA6IGI7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBUIE1heChjb25zdCBUICYgYSwgY29uc3QgVCAmIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBUIEtzbShjb25zdCBUICYgYSwgY29uc3QgVCAmIGIsIGNvbnN0IFQgJiBtKSB7IFQgXyA9IDE7IGZvciAoOyBiOyBiID4+PSAxLCBhID0gYSAqIGEgJSBtKSAoYiAmIDEpID8gXyA9IF8gKiBhICUgbSA6IDA7IHJldHVybiBfICUgbTsgfQp0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW5saW5lIHZvaWQgU3dhcChUICYgYSwgVCAmIGIpIHsgVCBfOyBfID0gYTsgYSA9IGI7IGIgPSBfOyB9Cgp0eXBlZGVmIGludCBwaW50W21heG4gKiAyXTsKdHlwZWRlZiBpbnQgZWludFttYXhtICogMl07CgppbnQgbiwgbSwgZSgxKSwgYW5zLCBudW1bbWF4bV0sIGRmbjsKcGludCBlZGdlLCB2cCwgdnBzLCBwcmUsIHN1YywgYXBzOwplaW50IG5leHQsIHBvaW50LCBzOwoKaW5saW5lIHZvaWQgbGluayhpbnQgdSwgaW50IHYpCnsKICAgcG9pbnRbKytlXSA9IHY7IG5leHRbZV0gPSBlZGdlW3VdOyBlZGdlW3VdID0gZTsKICAgcG9pbnRbKytlXSA9IHU7IG5leHRbZV0gPSBlZGdlW3ZdOyBlZGdlW3ZdID0gZTsKfQoKaW5saW5lIGludCBnZXRpbnQoKQp7CiAgIGNoYXIgY2ggPSBnZXRjaGFyKCk7IGludCByZXN1bHQgPSAwOwogICBmb3IgKDsgJzAnID4gY2ggfHwgY2ggPiAnOSc7IGNoID0gZ2V0Y2hhcigpKTsKICAgZm9yICg7ICcwJyA8PSBjaCAmJiBjaCA8PSAnOSc7ICkKICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyBjaCAtICcwJywgY2ggPSBnZXRjaGFyKCk7CiAgIHJldHVybiByZXN1bHQ7Cn0KCnZvaWQgaW5pdCgpCnsKICAgbiA9IGdldGludCgpLCBtID0gZ2V0aW50KCk7CiAgIGZvciAoaW50IGkgPSAxLCB1LCB2OyBpIDw9IG07ICsraSkKICAgICAgbGluayh1ID0gZ2V0aW50KCksIHYgPSBnZXRpbnQoKSk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG47ICsraSkKICAgICAgcHJlW2ldID0gaSAtIDEsIHN1Y1tpXSA9IGkgKyAxOwogICBwcmVbMF0gPSBuLCBzdWNbbl0gPSAwOwp9Cgp2b2lkIGJmcygpCnsKICAgaW50IGwsIHIsIHJlczsKICAgZm9yIChsID0gciA9IHJlcyA9IDEsIHNbbF0gPSBzdWNbMF07IGwgPD0gcjsgKytsKQogICB7CiAgICAgIGFwc1tzW2xdXSA9IDEsIHZwW3NbbF1dID0gKytkZm4sIHByZVtzdWNbc1tsXV1dID0gcHJlW3NbbF1dLCBzdWNbcHJlW3NbbF1dXSA9IHN1Y1tzW2xdXTsKICAgICAgZm9yIChpbnQgaSA9IGVkZ2Vbc1tsXV07IGk7IGkgPSBuZXh0W2ldKSB2cFtwb2ludFtpXV0gPSBkZm47CiAgICAgIGZvciAoaW50IGkgPSBzdWNbMF07IGk7IGkgPSBzdWNbaV0pCiAgICAgICAgIGlmICghYXBzW2ldICYmIHZwW2ldICE9IGRmbikKICAgICAgICAgewogICAgICAgICAgICBzWysrcl0gPSBpLCBhcHNbaV0gPSAxOwogICAgICAgICAgICBwcmVbc3VjW2ldXSA9IHByZVtpXSwgc3VjW3ByZVtpXV0gPSBzdWNbaV07CiAgICAgICAgICAgIGlmICghdnBzW2ldKSArK3JlcywgdnBzW2ldID0gMTsKICAgICAgICAgfQogICB9CiAgIG51bVthbnMgKyAxXSA9IHJlczsKfQoKdm9pZCBuZXdncmFwaCgpCnsKICAgZm9yICg7IHN1Y1swXTsgYmZzKCksICsrYW5zKTsKICAgc29ydChudW0gKyAxLCBudW0gKyBhbnMgKyAxKTsKICAgcHJpbnRmKCIlZFxuIiwgYW5zKTsKICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gYW5zOyArK2kpIAogICAgICBwcmludGYoIiVkICIsIG51bVtpXSk7Cn0KCmludCBtYWluKCkKewogICBpbml0KCk7CiAgIG5ld2dyYXBoKCk7CiAgIHJldHVybiAwOwp9