#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
return x*f;
}
typedef long long ll;
const int mod=1000000007;
char id[2333];
void Add(int& x,int y) {x+=y;if(x>=mod) x-=mod;}
int to1[8][3],to2[8][3];
void init(char* A,int* f,int c,int tp) {
id[‘W‘]=‘0‘;id[‘B‘]=‘1‘;id[‘X‘]=‘2‘;
rep(i,0,c-1) A[i]=id[A[i]];
rep(i,1,c-1) {
int j=f[i];
while(j&&A[i]!=A[j]) j=f[j];
f[i+1]=A[i]==A[j]?j+1:0;
}
rep(i,0,c) rep(k,0,2) {
int j=i;
while(j&&A[j]!=k+‘0‘) j=f[j];
if(A[j]==k+‘0‘) j++;
if(tp) to2[i][k]=j;
else to1[i][k]=j;
}
}
int n,m,c,f[2][1<<12][8][8],tmp[8];
char A[8],B[8];
void solve() {
int cur=0;scanf("%s%s",A,B);
init(A,tmp,c,0);init(B,tmp,c,1);
memset(f,0,sizeof(f));f[0][0][0][0]=1;
rep(x,1,n) rep(y,1,m) {
cur^=1;memset(f[cur],0,sizeof(f[cur]));
rep(S,0,(1<<m)-1) rep(i,0,c) rep(j,0,c) {
int& res=f[cur^1][S][i][j];if(!res) continue;
rep(k,0,2) {
int nx=to1[i][k],ny=to2[j][k],nS=S<<1;
if(nS>>m&1) nS^=(1<<m);if(nx==c) nS^=1;
if(y>=c&&ny==c&&(S>>(m-1)&1)) continue;
Add(f[cur][nS][nx][ny],res);
}
}
}
int ans=1;rep(i,1,n*m) ans=(ll)ans*3%mod;
rep(S,0,(1<<m)-1) rep(i,0,c) rep(j,0,c) Add(ans,mod-f[cur][S][i][j]);
printf("%d\n",ans);
}
int main() {
n=read();m=read();c=read();
dwn(T,read(),1) solve();
return 0;
}