#include <bits/stdc++.h>
using namespace std;
long long bigmod(long long b, long long p, long long md) {
  if (p == 0) return 1;
  if (p % 2 == 1) {
    return ((b % md) * bigmod(b, p - 1, md)) % md;
  } else {
    long long y = bigmod(b, p / 2, md);
    return (y * y) % md;
  }
}
set<int> vis;
set<int> st[200005];
vector<int> ans;
int cnt;
void dfs(int s) {
  cnt++;
  for (auto it = vis.begin(); it != vis.end();) {
    if (st[s].find(*it) == st[s].end()) {
      int node = *it;
      vis.erase(node);
      dfs(node);
      it = vis.lower_bound(node);
    } else
      it++;
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    st[a].insert(b);
    st[b].insert(a);
  }
  for (int i = 1; i <= n; i++) vis.insert(i);
  for (int i = 1; i <= n; i++) {
    if (vis.find(i) != vis.end()) {
      cnt = 0;
      vis.erase(i);
      dfs(i);
      ans.push_back(cnt);
    }
  }
  cout << ans.size() << "\n";
  sort(ans.begin(), ans.end());
  for (int i = 0; i < ans.size(); i++) cout << ans[i] << " ";
  return 0;
}
