#include<iostream>
#include<vector>
#include<string>
using namespace std;
using LL = long long;


int main(){
    int H, W;
    cin >> H >> W;
    vector<string> field;
    for (int i = 0; i < H; i++){
        string si;
        cin >> si;
        field.emplace_back(si);
    }

    vector<vector<int>> diag; //0:R, 1:B, 2:.
    for (int i = 0; i < H+W-1; i++){
        vector<int> a = {0,0,0};
        diag.emplace_back(a);
    }
    for (int i = 0; i < H; i++){
    for (int j = 0; j < W; j++){
        char s = field[i][j];
        if (s == 'R'){
            diag[i+j][0] += 1;
        } else if(s == 'B'){
            diag[i+j][1] += 1;
        } else {
            diag[i+j][2] += 1;
        }
    }}
    LL pat = 1;
    for (vector<int> v: diag){
        int rn = v[0], bn = v[1], dn = v[2];
        if (rn*bn != 0){
            cout << 0 << endl;
            return 0;
        } else if(rn == 0 && bn == 0 && dn != 0){
            pat = (pat*2)%998244353;
        }
    }
    cout << pat << endl;

}
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int N,M;
    int x,y;
    vector<string> A;
    char dna[20][20];

    cin >> N >> M;


    for(int i=0; i<M; i++) {
        string a;
        cin >> a;

        bool iscontain=false;
        for( int j=0; j<A.size(); j++)
            if(A[j].find(a)!=string::npos) {iscontain=true;break;}
        if(iscontain!=true) A.push_back(a);
    }

    bool convine=true;

    while(convine) {
        convine=false;
        for(int i=0; i<A.size(); i++) {
            if(A[i].size()>2){
                string b=A[i].substr(A[i].size()-2);
                for(int j=0; j<A.size(); j++) {
                    if( i==j ) continue;
                    if( A[j][0]==b[0] && A[j][1]==b[1] ){
                        if( A[i].size()+A[j].size()-2 <= N) {
                            A[i] = A[i] + A[j].substr(2);
                            A[j] ="";
                            convine=true;
                            break;
                        }
                    }
                }
            }
        }
    }

    convine=true;

    while(convine) {
        convine=false;
        for(int i=0; i<A.size(); i++) {
            if(A[i].size()>2 && A[i].size()<N){
                for(int j=0; j<A.size(); j++) {
                    if( i==j ) continue;
                    if( (A[j].size() > 2) && ((A[i].size()+A[j].size()) <= N) ){
                        A[i] = A[i] + A[j];
                        A[j] ="";
                        convine=true;
                        break;
                    }
                }
            }
        }
    }

    for(int i=0; i<N; i++){
        int max=A[i].size();
        int maxj=i;
        for(int j=i; j<A.size(); j++){
            if(A[j].size()>max) {
                max=A[j].size();
                maxj=j;
            }
        }
        if( i!=maxj){
            string tmp;
            tmp=A[maxj];
            A[maxj]=A[i];
            A[i]=tmp;
        }
    }

    for(int i=0; i<N; i++) {
        if(A[i].size() < 20) A[i]+="....................";
    }

    for(int i=0; i<N; i++) {
        cout << A[i].substr(0,20) << endl;
    }
};
