import sys, time, random from collections import deque, Counter, defaultdict import logging from logging import debug, error, info, warning logging.basicConfig(level=logging.DEBUG) input = lambda: sys.stdin.readline().rstrip() ii = lambda: int(input()) mi = lambda: map(int, input().split()) li = lambda: list(mi()) inf = 2 ** 61 - 1 mod = 998244353 class Combinatorics(): def __init__(self, mod, maxi): self.mod = mod self.maxi = maxi self.facs = [1] * (maxi + 1) self.factinvs = [1] * (maxi + 1) self.invs = [1] * (maxi + 1) for i in range(2, self.maxi + 1): self.facs[i] = ((self.facs[i-1] * i) % self.mod) self.invs[i] = (-self.invs[self.mod % i] * (self.mod // i)) % self.mod self.factinvs[i] = (self.factinvs[i-1] * self.invs[i]) % self.mod def choose(self, n, k): if k < 0 or k > n: return 0 if k == 0 or k == n: return 1 k = min(k, n - k) return (((self.facs[n] * self.factinvs[k]) % self.mod) * self.factinvs[n-k]) % self.mod def perm(self, n, k): return (self.choose(n, k) * self.facs[k]) % self.mod def homop(self, n, k): if n == k == 0: return 1 return self.choose(n + k - 1, k) C = Combinatorics(mod, 10 ** 5) n, m = mi() s = [input() for _ in range(n)] cnt = [0, 0, 0] qu = [0, 0, 0] for i in range(n): for j in range(m): if s[i][j] == 'B': cnt[(i + j) % 3] += 1 elif s[i][j] == '?': qu[(i + j) % 3] += 1 ans = 0 queven = [0, 0, 0] quodd = [0, 0, 0] for i in range(3): for j in range(0, qu[i] + 1, 2): queven[i] += C.choose(qu[i], j) queven[i] %= mod for j in range(1, qu[i] + 1, 2): quodd[i] += C.choose(qu[i], j) quodd[i] %= mod #000 ret = 1 for i in range(3): if cnt[i] % 2: ret *= queven[i] ret %= mod else: ret *= quodd[i] ret %= mod ans += ret ret = 1 for i in range(3): if cnt[i] % 2 == 0: ret *= queven[i] ret %= mod else: ret *= quodd[i] ret %= mod ans += ret print(ans % mod)