package main
import (
"bufio"
"io"
"os"
"sort"
"strconv"
)
func main() {
buf, _ := io.ReadAll(os.Stdin)
pos := 0
readInt := func() int {
for pos < len(buf) && (buf[pos] < '0' || buf[pos] > '9') {
pos++
}
if pos >= len(buf) {
return 0
}
res := 0
for pos < len(buf) && buf[pos] >= '0' && buf[pos] <= '9' {
res = res*10 + int(buf[pos]-'0')
pos++
}
return res
}
n := readInt()
if n == 0 {
return
}
m := readInt()
adjC := make([][]int, n+1)
for i := 0; i < m; i++ {
u := readInt()
v := readInt()
adjC[u] = append(adjC[u], v)
adjC[v] = append(adjC[v], u)
}
prev := make([]int, n+2)
next := make([]int, n+2)
for i := 1; i <= n; i++ {
prev[i] = i - 1
next[i] = i + 1
}
next[0] = 1
prev[n+1] = n
isAdjC := make([]bool, n+2)
var ans []int
q := make([]int, n)
for next[0] <= n {
start := next[0]
next[prev[start]] = next[start]
prev[next[start]] = prev[start]
head, tail := 0, 0
q[tail] = start
tail++
size := 0
for head < tail {
u := q[head]
head++
size++
for _, v := range adjC[u] {
isAdjC[v] = true
}
curr := next[0]
for curr <= n {
if !isAdjC[curr] {
next[prev[curr]] = next[curr]
prev[next[curr]] = prev[curr]
q[tail] = curr
tail++
}
curr = next[curr]
}
for _, v := range adjC[u] {
isAdjC[v] = false
}
}
ans = append(ans, size)
}
sort.Ints(ans)
out := bufio.NewWriter(os.Stdout)
out.WriteString(strconv.Itoa(len(ans)) + "\n")
for i, size := range ans {
if i > 0 {
out.WriteByte(' ')
}
out.WriteString(strconv.Itoa(size))
}
out.WriteByte('\n')
out.Flush()
}