← Home
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()
}