package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
// Custom buffer to handle potential large lines, though ScanWords is fine
buf := make([]byte, 1024*1024)
scanner.Buffer(buf, 1024*1024)
if !scanner.Scan() {
return
}
N, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
M, _ := strconv.Atoi(scanner.Text())
a := make([]int, N)
for i := 0; i < N; i++ {
scanner.Scan()
a[i], _ = strconv.Atoi(scanner.Text())
}
if N == 1 {
c := (a[0] + a[0]) % M
fmt.Println(1)
fmt.Println(c)
return
}
D := make([]int, N)
for i := 0; i < N-1; i++ {
D[i] = a[i+1] - a[i]
}
D[N-1] = M - a[N-1] + a[0]
DR := make([]int, N)
for i := 0; i < N-1; i++ {
DR[i] = D[N-2-i]
}
DR[N-1] = D[N-1]
S := make([]int, 2*N-1)
for i := 0; i < N; i++ {
S[i] = DR[i]
}
for i := 0; i < N-1; i++ {
S[N+i] = DR[i]
}
pi := make([]int, N)
for i := 1; i < N; i++ {
j := pi[i-1]
for j > 0 && D[i] != D[j] {
j = pi[j-1]
}
if D[i] == D[j] {
j++
}
pi[i] = j
}
var ans []int
j := 0
for i := 0; i < len(S); i++ {
for j > 0 && S[i] != D[j] {
j = pi[j-1]
}
if S[i] == D[j] {
j++
}
if j == N {
matchIndex := i - N + 1
c := (a[0] + a[N-1-matchIndex]) % M
ans = append(ans, c)
j = pi[j-1]
}
}
sort.Ints(ans)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
fmt.Fprintln(out, len(ans))
if len(ans) > 0 {
for i, v := range ans {
if i > 0 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, v)
}
fmt.Fprintln(out)
}
}