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

int h, w;
bool field[16][16];

long long dfs(int x, int y, int a, int b)
{
    //畳が足りない時。
    if(a < 0 || b < 0)return 0;

    //端まで行きついたら
    if(y == h) y = 0, x++;//左上に移動
    if(x == w)return 1;//右下端まで来たのでこれが一つ

    //もう使われてたら
    if(field[x][y] == true)return dfs(x, y + 1, a, b);

    //流れ
    /*
        一回おいてから、もっと深くまで探索する。
        探索が終わって帰ってきたら、外す。
    */
    
    long long ret = 0;
    //横に置く
    if(x + 1 < w && field[x + 1][y] == false)
    {
        field[x][y] = true;
        field[x + 1][y] = true;
        ret += dfs(x, y + 1, a - 1, b);
        field[x][y] = false;
        field[x + 1][y] = false;
    }
    //縦に置く
    if(y + 1 < h && field[x][y + 1] == false)
    {
        field[x][y] = true;
        field[x][y + 1] = true;
        ret += dfs(x, y + 1, a - 1, b);
        field[x][y] = false;
        field[x][y + 1] = false;
    }
    //半畳を置く
    field[x][y] = true;
    ret += dfs(x, y + 1, a, b - 1);
    field[x][y] = false;

    return ret;
}

int main()
{
    int a, b;
    cin >> h >> w >> a >> b;

    //横に置く、縦に置く、半畳を置く
    cout << dfs(0, 0, a, b) << endl;
}
// I SELL YOU...! 
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<queue>
#include<chrono>
#include<iomanip>
#include<map>
#include<set>
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
using TP = tuple<ll,ll,ll>;
void init_io(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(18);
}
const ll MOD = 998244353;
const ll MAX = 5100;
bool can[MAX][MAX][3];
ll dp[MAX][MAX]={};
ll modinv(ll a, ll m){
  ll b=m,u=1,v=0;
  while(b){
    ll t=a/b;
    a-=t*b; swap(a,b);
    u-=t*v; swap(u,v);
  }
  u%=m;
  if(u<0) u+=m;
  return u;
}
signed main(){
  init_io();
  ll H,W,K,fi=1,mv;
  cin >> H >> W >> K;
  mv = modinv(3,MOD);
  vector<ll> h(K),w(K);
  vector<char> c(K);
  for(int i=0;i<MAX;i++){
    for(int j=0;j<MAX;j++){
      for(int k=0;k<3;k++){
        can[i][j][k] = true;
      }
    }
  }
  for(ll i=0;i<H*W-K;i++){
    fi *= 3;
    fi %= MOD;
  }
  for(int i=0;i<K;i++){
    cin >> h[i] >> w[i] >> c[i];
    h[i]--;
    w[i]--;
    for(int j=0;j<3;j++){
      can[h[i]][w[i]][j] = false;
    }
    if(c[i]=='R') can[h[i]][w[i]][0] = true;
    if(c[i]=='D') can[h[i]][w[i]][1] = true;
    if(c[i]=='X') can[h[i]][w[i]][2] = true;
  }
  dp[0][0] = 1;
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      ll nv = dp[i][j];
      if(can[i][j][0]&&can[i][j][1]&&can[i][j][2]){
        nv = (nv*2*mv);
        nv %= MOD;
        dp[i][j+1] = (dp[i][j+1]+nv)%MOD;
        dp[i+1][j] = (dp[i+1][j]+nv)%MOD;
      }else if(can[i][j][0]){
        dp[i][j+1] = (dp[i][j+1]+nv)%MOD;
      }else if(can[i][j][1]){
        dp[i+1][j] = (dp[i+1][j]+nv)%MOD;
      }else if(can[i][j][2]){
        dp[i][j+1] = (dp[i][j+1]+nv)%MOD;
        dp[i+1][j] = (dp[i+1][j]+nv)%MOD;
      }
    }
  }
  cout << (dp[H-1][W-1]*fi)%MOD << endl;
}
