package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
func power(base, exp int64) int64 {
res := int64(1)
base %= MOD
for exp > 0 {
if exp%2 == 1 {
res = (res * base) % MOD
}
base = (base * base) % MOD
exp /= 2
}
return res
}
func inverse(n int64) int64 {
return power(n, MOD-2)
}
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(reader, &n, &m)
var aStr, bStr string
fmt.Fscan(reader, &aStr, &bStr)
ca := make([]int, 26)
cb := make([]int, 26)
for i := 0; i < n; i++ {
ca[aStr[i]-'A']++
}
for i := 0; i < m; i++ {
cb[bStr[i]-'A']++
}
fact := make([]int64, n+1)
invFact := make([]int64, n+1)
fact[0] = 1
invFact[0] = 1
for i := 1; i <= n; i++ {
fact[i] = (fact[i-1] * int64(i)) % MOD
}
invFact[n] = inverse(fact[n])
for i := n - 1; i >= 1; i-- {
invFact[i] = (invFact[i+1] * int64(i+1)) % MOD
}
dp := make([]int64, ca[0]+1)
for x := 0; x <= ca[0]; x++ {
if x <= cb[0] {
dp[x] = (invFact[x] * invFact[ca[0]-x]) % MOD
}
}
for c := 1; c < 26; c++ {
prevLen := ca[c-1] + 1
suf := make([]int64, prevLen+1)
for i := prevLen - 1; i >= 0; i-- {
suf[i] = (suf[i+1] + dp[i]) % MOD
}
currLen := ca[c] + 1
newDp := make([]int64, currLen)
startX, endX := 0, ca[c]
if c == 25 {
startX, endX = ca[25], ca[25]
}
for x := startX; x <= endX; x++ {
minPrev := x + ca[c-1] - cb[c]
if minPrev < 0 {
minPrev = 0
}
var sumPrev int64 = 0
if minPrev < prevLen {
sumPrev = suf[minPrev]
}
term := (invFact[x] * invFact[ca[c]-x]) % MOD
newDp[x] = (sumPrev * term) % MOD
}
dp = newDp
}
ans := (dp[ca[25]] * fact[n]) % MOD
fmt.Println(ans)
}