#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
const int MAX_N = int(1e5 + 5);
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define SORT(v) sort((v).begin(), (v).end())
#define ALL(v) (v).begin(), (v).end()

int main() {
    ll n, m, a[1005], b[1005], used = 0, ans = 1;
    cin >> n >> m;
    REP(i,n) cin >> a[i];
    REP(i,m) cin >> b[i];
    sort(a,a+n);
    sort(b,b+m);
    REP(i,n-1){
        if(a[i]==a[i+1])ans = 0;
    }
    REP(i,m-1){
        if(b[i]==b[i+1])ans = 0;
    }
    // 大きい数から埋める
    // 書きこみ可能なマスの個数をかけていく
    for(int k = n*m; k>0; k--){
        int i = lower_bound(a,a+n,k)-a;
        int j = lower_bound(b,b+m,k)-b;
        if(a[i]==k && b[j]==k){

        }
        else if(a[i]==k){
            ans *= m-j;
        }
        else if(b[j]==k){
            ans *= n-i;
        }
        else{
            ans *= max(0ll,(n-i)*(m-j)-used);
        }
        used++;
        ans %= MOD;
    }
    cout << ans << endl;
    return 0;
}
