```go
package main
import (
"bufio"
"fmt"
"os"
)
const N = 10000
const TN = 4 * (N + 1)
const BSS = (2*N + 100 + 63) / 64
var bits [TN][]uint64
var lazy [TN][]int
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
var n, q int
fmt.Fscan(in, &n, &q)
type op struct {
l, r, x int
}
ops := make([]op, q)
for i := 0; i < q; i++ {
fmt.Fscan(in, &ops[i].l, &ops[i].r, &ops[i].x)
}
for i := 0; i < TN; i++ {
bits[i] = make([]uint64, BSS)
lazy[i] = make([]int, 0)
}
build(1, 1, n)
for _, o := range ops {
if o.l <= o.r {
update(1, 1, n, o.l, o.r, o.x)
}
}
push(1, 1, n)
bs := bits[1]
var res []int
for y := 1; y <= n; y++ {
idx := y / 64
bit := uint64(1) << (y % 64)
if (bs[idx] & bit) != 0 {
res = append(res, y)
}
}
fmt.Fprintln(out, len(res))
for i, v := range res {
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, v)
}
fmt.Fprintln(out)
}
func build(node, start, end int) {
if start == end {
bits[node][0] = 1
return
}
mid := (start + end) / 2
build(2*node, start, mid)
build(2*node+1, mid+1, end)
orbit(&bits[node], bits[2*node], bits[2*node+1])
}
func push(node, start, end int) {
if len(lazy[node]) > 0 {
for _, x := range lazy[node] {
shiftOr(&bits[node], x)
}
if start != end {
lazy[2*node] = append(lazy[2*node], lazy[node]...)
lazy[2*node+1] = append(lazy[2*node+1], lazy[node]...)
}
lazy[node] = lazy[node][:0]
}
}
func update(node, start, end, us, ue, x int) {
push(node, start, end)
if end < us || start > ue {
return
}
if us <= start && end <= ue {
shiftOr(&bits[node], x)
if start != end {
lazy[2*node] = append(lazy[2*node], x)
lazy[2*node+1] = append(lazy[2*node+1], x)
}
return
}
mid := (start + end) / 2
update(2*node, start, mid, us, ue, x)
update(2*node+1, mid+1, end, us, ue, x)
orbit(&bits[node], bits[2*node], bits[2*node+1])
}
func shiftOr(bs *[]uint64, x int) {
if x == 0 || x > N {
return
}
b := *bs
shifted := make([]uint64, BSS)
wordShift := x / 64
bitShift := x % 64
carry := uint64(0)
for i := 0; i < BSS; i++ {
tmp := b[i]
if i+wordShift < BSS {
shifted[i+wordShift] |= (tmp << bitShift) | carry
}
carry = tmp >> (64 - bitShift)
if bitShift == 0 {
carry = 0
}
if i+wordShift+1 < BSS {
shifted[i+wordShift+1] |= carry
}
}
for i := 0; i < BSS; i++ {
b[i] |= shifted[i]
}
}
func orbit(dest *[]uint64, a, b []uint64) {
d := *dest
for i := 0; i < BSS; i++ {
d[i] = a[i] | b[i]
}
}
```