#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

const ll MOD = 1000000007;

vector<ll> sil(2000001);

ll Pot(ll n, ll k)
{
    if (k == 0)
        return 1;
    if (k % 2 == 0)
    {
        ll p = Pot(n, k / 2);
        return p * p % MOD;
    }
    return Pot(n, k - 1) * n % MOD;
}

ll Inv(ll n)
{
    return Pot(n, MOD - 2);
}

ll C(ll n, ll k)
{
    return (sil[n] * Inv(sil[k] * sil[n - k] % MOD)) % MOD;
}

int main()
{
    ios_base::sync_with_stdio(0);
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m);
    vector<int> gdziex(n * m, -1), gdziey(n * m, -1);
    bool zle = false;
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i];
        --a[i];
        if (gdziex[a[i]] != -1)
            zle = true;
        gdziex[a[i]] = i;
    }
    for (int i = 0; i < m; ++i)
    {
        cin >> b[i];
        --b[i];
        if (gdziey[b[i]] != -1)
            zle = true;
        gdziey[b[i]] = i;
    }
    if (zle)
    {
        cout << "0";
        return 0;
    }
    sil[0] = 1;
    for (ll i = 1; i < 2000001; ++i)
        sil[i] = (sil[i - 1] * i) % MOD;
    ll odp = 1, dysp = 0;
    vector< vector<bool> > puste(n, vector<bool>(m, true));
    vector<int> pustex(n, m), pustey(m, n);
    for (int i = 0; i < n * m; ++i)
    {
        ++dysp;
        if (gdziex[i] != -1 && gdziey[i] == -1)
        {
            if (dysp < pustex[gdziex[i]])
                odp = 0;
            ll sp = (C(dysp - 1, pustex[gdziex[i]] - 1) * sil[pustex[gdziex[i]] - 1]) % MOD;
            sp = (sp * pustex[gdziex[i]]) % MOD;
            odp = (odp * sp) % MOD;
            for (int j = 0; j < m; ++j)
            {
                if (puste[gdziex[i]][j])
                {
                    puste[gdziex[i]][j] = false;
                    --pustey[j];
                    --pustex[gdziex[i]];
                    --dysp;
                }
            }
        }
        if (gdziex[i] == -1 && gdziey[i] != -1)
        {
            if (dysp < pustey[gdziey[i]])
                odp = 0;
            ll sp = (C(dysp - 1, pustey[gdziey[i]] - 1) * sil[pustey[gdziey[i]] - 1]) % MOD;
            sp = (sp * pustey[gdziey[i]]) % MOD;
            odp = (odp * sp) % MOD;
            for (int j = 0; j < n; ++j)
            {
                if (puste[j][gdziey[i]])
                {
                    puste[j][gdziey[i]] = false;
                    --pustey[gdziey[i]];
                    --pustex[j];
                    --dysp;
                }
            }
        }
        if (gdziex[i] != -1 && gdziey[i] != -1)
        {
            ll ilepuste = pustex[gdziex[i]] + pustey[gdziey[i]] - 1;
            if (dysp < ilepuste)
                odp = 0;
            ll sp = (C(dysp - 1, ilepuste - 1) * sil[ilepuste - 1]) % MOD;
            odp = (odp * sp) % MOD;
            for (int j = 0; j < n; ++j)
            {
                if (puste[j][gdziey[i]])
                {
                    puste[j][gdziey[i]] = false;
                    --pustey[gdziey[i]];
                    --pustex[j];
                    --dysp;
                }
            }
            for (int j = 0; j < m; ++j)
            {
                if (puste[gdziex[i]][j])
                {
                    puste[gdziex[i]][j] = false;
                    --pustey[j];
                    --pustex[gdziex[i]];
                    --dysp;
                }
            }
        }
    }
    cout << odp;
    return 0;
}


Measured memory_bytes: 23936