package main
import (
"bufio"
"io"
"os"
"runtime/debug"
"strconv"
)
const (
B1 uint64 = 11400714819323198485
B2 uint64 = 14029467366897019727
)
func htIndex(h1, h2 uint64) int {
return int((h1^(h1>>33)^h2^(h2>>29)) & 63)
}
func htInsert(k1, k2 *[64]uint64, v *[64]int8, h1, h2 uint64, x int8) {
i := htIndex(h1, h2)
for v[i] != 0 {
if k1[i] == h1 && k2[i] == h2 {
v[i] = x
return
}
i = (i + 1) & 63
}
k1[i] = h1
k2[i] = h2
v[i] = x
}
func htFind(k1, k2 *[64]uint64, v *[64]int8, h1, h2 uint64) int8 {
i := htIndex(h1, h2)
for {
if v[i] == 0 {
return 0
}
if k1[i] == h1 && k2[i] == h2 {
return v[i]
}
i = (i + 1) & 63
}
}
func main() {
debug.SetGCPercent(-1)
data, _ := io.ReadAll(os.Stdin)
p := 0
readInt := func() int {
for p < len(data) && data[p] <= 32 {
p++
}
n := 0
for p < len(data) && data[p] > 32 {
n = n*10 + int(data[p]-'0')
p++
}
return n
}
readString := func() string {
for p < len(data) && data[p] <= 32 {
p++
}
start := p
for p < len(data) && data[p] > 32 {
p++
}
return string(data[start:p])
}
n := readInt()
m := readInt()
s := readString()
t := readString()
powM1, powM2 := uint64(1), uint64(1)
for i := 0; i < m; i++ {
powM1 *= B1
powM2 *= B2
}
var pref1 [26][]uint64
var pref2 [26][]uint64
for c := 0; c < 26; c++ {
a1 := make([]uint64, n+1)
a2 := make([]uint64, n+1)
ch := byte('a' + c)
var h1, h2 uint64
for i := 0; i < n; i++ {
var bit uint64
if s[i] == ch {
bit = 1
}
h1 = h1*B1 + bit
h2 = h2*B2 + bit
a1[i+1] = h1
a2[i+1] = h2
}
pref1[c] = a1
pref2[c] = a2
}
var tk1, tk2 [64]uint64
var tv [64]int8
for c := 0; c < 26; c++ {
ch := byte('a' + c)
var h1, h2 uint64
for i := 0; i < m; i++ {
var bit uint64
if t[i] == ch {
bit = 1
}
h1 = h1*B1 + bit
h2 = h2*B2 + bit
}
if h1 != 0 || h2 != 0 {
htInsert(&tk1, &tk2, &tv, h1, h2, int8(c+1))
}
}
ans := make([]int, 0, n-m+1)
for l := 0; l+m <= n; l++ {
r := l + m
var g [26]byte
var mask uint32
ok := true
for a := 0; a < 26; a++ {
p1 := pref1[a]
p2 := pref2[a]
h1 := p1[r] - p1[l]*powM1
h2 := p2[r] - p2[l]*powM2
if h1 == 0 && h2 == 0 {
continue
}
b := htFind(&tk1, &tk2, &tv, h1, h2)
if b == 0 {
ok = false
break
}
mask |= uint32(1) << uint(a)
g[a] = byte(b - 1)
}
if ok {
for a := 0; a < 26; a++ {
if mask&(uint32(1)<<uint(a)) == 0 {
continue
}
b := int(g[a])
if b != a && (mask&(uint32(1)<<uint(b))) != 0 && int(g[b]) != a {
ok = false
break
}
}
}
if ok {
ans = append(ans, l+1)
}
}
out := make([]byte, 0, len(ans)*7+32)
out = strconv.AppendInt(out, int64(len(ans)), 10)
out = append(out, '\n')
for i, v := range ans {
if i > 0 {
out = append(out, ' ')
}
out = strconv.AppendInt(out, int64(v), 10)
}
out = append(out, '\n')
w := bufio.NewWriterSize(os.Stdout, 1<<20)
w.Write(out)
w.Flush()
}