7 20
4 6
6 7
4 5
1 2
2 4
1 7
3 5
2 1
6 2
6 1
7 3
3 2
3 6
3 1
3 4
2 5
1 6
7 4
6 3
7 5
 8 23
1 2
1 4
1 6
1 8
2 3
2 4
2 5
2 6
2 7
2 8
3 4
3 5
3 6
3 7
3 8
4 5
4 6
4 7
5 6
5 7
5 8
6 8
7 8
 4 4
2 1
3 1
1 4
3 2
 8 18
1 4
1 6
1 7
2 3
2 4
2 5
2 6
2 7
2 8
3 4
3 8
4 7
5 6
5 7
5 8
6 7
6 8
7 8
 10 34
7 10
2 3
2 4
2 5
9 10
2 7
2 8
2 10
4 5
4 6
4 7
4 8
4 9
6 7
6 8
6 9
6 10
1 2
1 3
1 5
8 9
1 6
1 7
1 8
1 9
1 10
3 4
3 5
3 6
3 8
3 10
5 6
5 9
5 10
 5 7
1 2
2 3
3 4
1 5
2 5
3 5
4 5
 2 0
 8 23
2 7
7 5
8 6
8 2
6 3
3 5
8 1
8 4
8 3
3 4
1 2
2 6
5 2
6 4
7 6
6 5
7 8
7 1
5 4
3 7
1 4
3 1
3 2
 2 1
1 2
 6 9
1 2
1 4
1 5
2 3
2 5
2 6
3 5
4 6
5 6
 12 56
9 5
2 6
9 8
5 4
1 11
1 6
4 1
1 10
10 3
8 4
5 1
9 1
5 10
2 7
11 5
6 11
5 8
7 6
3 2
12 7
8 6
12 3
1 2
8 1
2 11
10 12
4 6
5 12
2 4
10 2
7 3
12 11
7 10
7 1
9 2
11 9
9 10
8 7
11 3
7 9
5 7
4 12
3 5
12 2
4 10
9 12
5 2
9 4
11 8
8 2
3 6
4 11
8 10
6 10
3 9
3 4
 12 58
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 10
1 11
1 12
2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 10
2 11
2 12
3 4
3 5
3 6
3 7
3 8
3 9
3 10
3 11
3 12
4 5
4 6
4 8
4 11
4 12
5 6
5 7
5 8
5 9
5 10
5 11
6 7
6 8
6 9
6 10
6 11
6 12
7 8
7 9
7 10
7 11
7 12
8 9
8 10
8 11
9 10
9 11
9 12
10 12
 4 3
2 1
3 1
4 2
 3 1
2 3
 6 10
1 2
1 3
1 4
1 6
2 3
2 4
2 5
3 5
3 6
4 6
 11 49
10 3
6 4
11 3
7 6
10 6
6 1
4 3
10 2
4 5
9 2
10 1
5 7
1 5
9 7
2 11
8 6
3 9
2 5
9 5
6 5
1 4
11 9
1 7
8 10
3 6
3 7
11 5
6 9
4 10
8 7
4 9
8 2
4 2
8 11
7 4
9 10
8 1
10 7
3 2
5 8
8 9
1 3
2 7
10 11
5 3
10 5
4 11
1 11
8 3
 5 4
1 4
2 3
4 3
4 2
 4 3
1 2
3 1
4 3
 4 3
1 3
1 4
2 3
 10 36
7 8
7 9
2 3
2 4
2 5
9 10
2 7
2 8
2 9
2 10
4 5
4 6
4 7
4 8
4 10
6 7
6 9
6 10
1 2
1 3
1 4
8 9
1 5
8 10
1 7
1 8
1 9
1 10
3 4
3 6
3 7
3 9
5 6
5 7
5 9
5 10
 8 15
2 1
4 5
2 4
3 4
2 5
3 5
2 6
3 6
5 6
4 6
2 7
3 8
2 8
3 7
6 7

3
1 2 4 
 3
1 2 5 
 2
1 3 
 1
8 
 1
10 
 2
1 4 
 1
2 
 3
1 3 4 
 2
1 1 
 1
6 
 3
1 4 7 
 4
1 1 1 9 
 1
4 
 1
3 
 1
6 
 5
1 1 1 2 6 
 1
5 
 1
4 
 1
4 
 2
2 8 
 1
8 

#include <bits/stdc++.h>
using namespace std;
long long modular_pow(long long base, long long exponent, long long modulus) {
  long long result = 1;
  while (exponent > 0) {
    if (exponent % 2 == 1) result = (result * base) % modulus;
    exponent = exponent >> 1;
    base = (base * base) % modulus;
  }
  return result;
}
void computePrefixTable(string pat, vector<int>& v) {
  int len = 0;
  v[0] = 0;
  int i = 1;
  while (i < pat.size()) {
    if (pat[i] == pat[len]) {
      len++;
      v[i] = len;
      i++;
    } else {
      if (len != 0) {
        len = v[len - 1];
      } else {
        v[i] = 0;
        i++;
      }
    }
  }
}
long long countDistinctSubstrings(string s, int i, int j) {
  string r = s.substr(i, j - i + 1);
  vector<int> v(r.size(), 0);
  computePrefixTable(r, v);
  long long tot = v.size() * (v.size() + 1) / 2;
  for (int k = 0; k < v.size(); k++) {
    tot -= v[k];
  }
  return tot;
}
long long gcd(long long a, long long b) { return (b == 0) ? a : gcd(b, a % b); }
long long numDigits(long long i) {
  return i > 0 ? (long long)log10((double)i) + 1 : 1;
}
long long dist(long long ax, long long ay, long long bx, long long by) {
  return (bx - ax) * (bx - ax) + (by - ay) * (by - ay);
}
struct loc {
  int x, y;
  int d;
  bool operator<(const loc& o) const { return d > o.d; }
};
set<pair<int, int>> noEdge;
long long cnt = 0;
long long numConnected = 0;
int vis[200000];
set<int> unvis;
void bfs(int x) {
  if (vis[x]) return;
  queue<int> q;
  q.push(x);
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    cnt++;
    if (vis[cur]) continue;
    vis[cur] = 1;
    unvis.erase(unvis.find(cur));
    for (set<int>::iterator it = unvis.begin(); it != unvis.end(); it++) {
      if (noEdge.find(make_pair(x, *it)) == noEdge.end()) {
        q.push(*it);
        vis[*it] = 1;
      }
    }
  }
}
int main() {
  long long n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    noEdge.insert(make_pair(x, y));
    noEdge.insert(make_pair(y, x));
  }
  vector<long long> cc;
  for (int i = 0; i < n; i++) {
    unvis.insert(i);
  }
  for (int i = 0; i < n; i++) {
    if (!vis[i]) {
      bfs(i);
      cc.push_back(cnt);
      numConnected++;
      cnt = 0;
    }
  }
  cout << numConnected << endl;
  sort(cc.begin(), cc.end());
  for (int i = cc.size() - 1; i >= 0; i--) {
    cout << cc[i];
    if (i == 0)
      cout << endl;
    else
      cout << " ";
  }
}
