package main
import (
"bufio"
"fmt"
"io"
"os"
"sort"
)
func main() {
buffer, _ := io.ReadAll(os.Stdin)
pos := 0
readInt := func() int {
for pos < len(buffer) && (buffer[pos] < '0' || buffer[pos] > '9') {
pos++
}
if pos >= len(buffer) {
return 0
}
res := 0
for pos < len(buffer) && buffer[pos] >= '0' && buffer[pos] <= '9' {
res = res*10 + int(buffer[pos]-'0')
pos++
}
return res
}
n := readInt()
if n == 0 {
return
}
m := readInt()
headEdge := make([]int, n+1)
for i := 0; i <= n; i++ {
headEdge[i] = -1
}
to := make([]int, 2*m)
nxtEdge := make([]int, 2*m)
edgeCnt := 0
addEdge := func(u, v int) {
to[edgeCnt] = v
nxtEdge[edgeCnt] = headEdge[u]
headEdge[u] = edgeCnt
edgeCnt++
}
for i := 0; i < m; i++ {
u := readInt()
v := readInt()
addEdge(u, v)
addEdge(v, u)
}
next := make([]int, n+2)
prev := make([]int, n+2)
for i := 1; i <= n; i++ {
next[i] = i + 1
prev[i] = i - 1
}
next[n] = 0
prev[1] = 0
head := 1
isAdj := make([]bool, n+1)
var components [][]int
queue := make([]int, 0, n)
for head != 0 {
start := head
head = next[start]
if head != 0 {
prev[head] = 0
}
queue = queue[:0]
queue = append(queue, start)
comp := []int{}
for len(queue) > 0 {
u := queue[0]
queue = queue[1:]
comp = append(comp, u)
for e := headEdge[u]; e != -1; e = nxtEdge[e] {
isAdj[to[e]] = true
}
curr := head
for curr != 0 {
nxt := next[curr]
if !isAdj[curr] {
if prev[curr] != 0 {
next[prev[curr]] = nxt
} else {
head = nxt
}
if nxt != 0 {
prev[nxt] = prev[curr]
}
queue = append(queue, curr)
}
curr = nxt
}
for e := headEdge[u]; e != -1; e = nxtEdge[e] {
isAdj[to[e]] = false
}
}
components = append(components, comp)
}
sort.Slice(components, func(i, j int) bool {
return len(components[i]) < len(components[j])
})
out := bufio.NewWriter(os.Stdout)
fmt.Fprintln(out, len(components))
for _, comp := range components {
sort.Ints(comp)
fmt.Fprint(out, len(comp))
for _, v := range comp {
fmt.Fprint(out, " ", v)
}
fmt.Fprintln(out)
}
out.Flush()
}