#include <bits/stdc++.h>
using namespace std;
int n, m;
set<int> nv;
set<int> adj[1000006];
int cnt = 0;
vector<int> ans;
bool vstd[1000006];
void dfs(int x) {
  cnt++;
  vstd[x] = 1;
  nv.erase(x);
  for (auto i = nv.begin(); i != nv.end();) {
    if (adj[x].count(*i)) {
      i++;
      continue;
    }
    int t = *i;
    dfs(t);
    i = nv.lower_bound(t);
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    adj[x].insert(y);
    adj[y].insert(x);
  }
  for (int i = 1; i <= n; i++) {
    nv.insert(i);
  }
  for (int i = 1; i <= n; i++) {
    if (!vstd[i]) {
      cnt = 0;
      dfs(i);
      ans.push_back(cnt);
    }
  }
  sort(ans.begin(), ans.end());
  cout << ans.size() << endl;
  for (auto i : ans) {
    printf("%d ", i);
  }
  return 0;
}
