#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5;
set<int> p;
set<int> g[MAXN + 10];
int P[MAXN + 10];
bool V[MAXN + 10];
int bfs(int cur) {
  queue<int> q;
  q.push(cur);
  V[cur] = true;
  int s = 0;
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    p.erase(cur);
    set<int>::iterator it = p.begin();
    s++;
    while (it != p.end()) {
      if (g[cur].count(*it)) {
        it++;
      } else {
        q.push(*it);
        V[*it] = true;
        it = p.erase(it);
      }
    }
  }
  return s;
}
int S[MAXN + 10];
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) p.insert(i);
  int u, v;
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &u, &v);
    g[u].insert(v);
    g[v].insert(u);
  }
  int tot = 0;
  for (int i = 1; i <= n; i++) {
    if (!V[i]) {
      S[tot++] = bfs(i);
    }
  }
  printf("%d\n", tot);
  sort(S, S + tot);
  for (int i = 0; i < tot; i++) printf("%d ", S[i]);
  printf("\n");
  return 0;
}
