#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
int f[12001];
int fi[12001];
int n, k;
int m(int a,int b){
	return (a * b)% mod;
}
int fp(int x,int y) {
	int res=1;
	while(y){
		if(y&1) res = res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
int iv(int x){
	return fp(x, mod - 2);
}
int c(int x, int y){
	// chon x tu y
	return m(f[y],m(fi[x],fi[y - x]));
}
int ck(int x,int y){
	// chia x keo cho y em
	if(x < 0) return 0;
	return c(y - 1 ,x + y - 1);
}

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	f[0] = 1;
	for(int i = 1 ; i <= 10000 ; i ++) f[i] = m(f[i - 1], i);
	fi[10000] = iv(f[10000]);
	for(int i = 9999 ; i >= 0 ; i --) fi[i] = m(fi[i + 1], (i + 1));
	
//	int u,v;
//	while(cin >> u >> v)
//		cout << ck(u,v) << endl;
	cin >> k >> n;
	for(int i = 2 ; i <= k + k ; i ++){
		int p = 0;
		for(int j = 1 ; j <= k ; j ++){
			int _j = i - j;
			if(_j > 0 && _j != j && _j <= k) p ++;
		}
		p/= 2;
//		cout << "#i = " << i << endl;
		if(i % 2 == 1){
			int ans = 0;
			for(int q = 0; q <= p ; q ++){
//				cout << "#q = " << q << endl;
//				cout << "pair = " << c(q,p) << endl;
//				cout << "n - q = " << n - q << endl;
//				cout << "q + k - 2p = " << q + k - 2*p << endl;
//				cout << "ck = " << ck(n - q, q + k - 2*p) << endl;
				ans = (ans + m(m(c(q, p),fp(2,q)),ck(n - q, q + k - 2*p)))%mod;
			}
			cout << ans << endl;
		} else{
			int ans = 0;
			for(int q = 0; q <= p ; q ++)
				ans = (ans + m(m(c(q, p),fp(2,q)), ck(n - q - 1, q + k - 2*p - 1)))%mod;
			for(int q = 0; q <= p ; q ++)
				ans = (ans + m(m(c(q, p),fp(2,q)), ck(n - q , q + k - 2*p - 1)))%mod;
			cout << ans << endl;
		}
	}
}

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

const ll MOD = 1e9+7;

int main(){ 
  int N,M; cin >> N >> M;
  
  vector<ll> A(N),B(M);
  
  map<ll,ll> mA,mB;
  
  for(int i = 0; i < N; i++){ cin >> A[i]; mA[A[i]]++;}
  for(int j = 0; j < M; j++){ cin >> B[j]; mB[B[j]]++;}
  
  for(auto ne : mA){ if(ne.second>=2){ cout<< 0 << endl; return 0;}}
  for(auto ne : mB){ if(ne.second>=2){ cout<< 0 << endl; return 0;}}
  
  //以後、同じ数字はA,B内に複数回現れない
  
  sort(A.begin(),A.end());
  sort(B.begin(),B.end());
  
  //でかい方から決めていく
  
  ll ans = 1LL;
  
  
  for(ll i = N*M; i >= 1; i--){
    
    ll res1 = lower_bound(A.begin(),A.end(),i)-A.begin();
    ll res2 = lower_bound(B.begin(),B.end(),i)-B.begin();
    
    
    if( A[res1] == i && B[res2] == i){ //どちらにも含まれている時
      continue;}
    else if(A[res1] == i && B[res2] != i){
      ans *= (M-res2);
      ans %= MOD;
    }
    else if(A[res1] != i && B[res2] == i){
      ans *= (N-res1);
      ans %= MOD;
    }
    else{
      if( (N-res1)*(M-res2) <= (N*M-i)){ ans = 0;}
      ans *= ((N-res1)*(M-res2)-(N*M-i));
      ans = (ans+MOD)%MOD;
    }
  }
  
  cout << ans << endl;
  
  return 0;
}
     
  