#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vl;

const int M=1000005,mod=998244353;
ll F[M];

ll Pow(ll n,ll p){
	ll r=1;
	for(;p>0;p>>=1){
		if(p&1) r=(r*n)%mod;
		n=(n*n)%mod;
	}
	return r;
}
ll Div(ll n,ll m){return n*Pow(m,mod-2)%mod;}
ll nCk(ll n,ll k){
	if(n<0) return 1;
	return Div(F[n],F[n-k]*F[k]%mod);
}

int n,m;
string A,B,C,D;

bool Check(string s){
	int N=s.size();
	return s==string(N,'0');
}

vl ff(){
	vl a(m+1);
	a[0]++;
	if(Check(A)){
		for(int i=0;i<m&&C[i]=='0'&&D[i]=='0';i++) a[i+1]++;
	}
	else{
		int S=0,t=0;
		for(int i=0;i<n;i++) S+=A[i]-'0';
		for(int i=0;i<m;i++){
			t+=C[i]-'0'+D[i]-'0';
			a[i+1]=nCk(S+t-1,t);
		}
	}
	swap(A,B);reverse(C.begin(),C.end());reverse(D.begin(),D.end());
	return a;
}

ll f(){
	ll res=0,t=0;
	vl a=ff(),b=ff();
	for(int i=0;i<m;i++) if(C[i]=='1'||D[i]=='1'){
		t=(C[i]-'0'+D[i]-'0')*(a[i]+t)%mod;
		(res+=t*b[m-1-i])%=mod;
	}
	swap(A,C);swap(B,D);swap(n,m);
	return res;
}

int main(){
	cin>>n>>m>>A>>B>>C>>D;
	F[0]=1;
	for(int i=1;i<M;i++) F[i]=F[i-1]*i%mod;
	if(Check(A)&&Check(B)&&Check(C)&&Check(D)) cout<<1<<endl;
	else cout<<(f()+f())%mod<<endl;
}