using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace atcorder_keyence_2019
{

    class Program
    {
        public const int MOD = 1000000007;
        static void Main(string[] args)
        {

            int[] line = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int sizeRow = line[0];
            int sizeCol = line[1];


            //int sizeRow = 14;
            //int sizeCol = 13;

            //int sizeRow = 2;
            //int sizeCol = 2;

            //int sizeRow = 3;
            //int sizeCol = 3;

            int dataCnt = sizeRow * sizeCol;

            int bigSize = 0;
            if (sizeRow < sizeCol)
            {
                bigSize = sizeCol;
            }
            else
            {
                bigSize = sizeRow;
            }

            int[] dataRow = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int[] dataCol = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);


            //int[] dataRow = Array.ConvertAll("158 167 181 147 178 151 179 182 176 169 180 129 175 168".Split(' '),int.Parse);
            //int[] dataCol = Array.ConvertAll("181 150 178 179 167 180 176 169 182 177 175 159 173".Split(' '),int.Parse);

            //int[] dataRow = Array.ConvertAll("4 4".Split(' '),int.Parse);
            //int[] dataCol = Array.ConvertAll("4 4".Split(' '),int.Parse);

            //int[] dataRow = Array.ConvertAll("5 9 7".Split(' '),int.Parse);
            //int[] dataCol = Array.ConvertAll("3 6 9".Split(' '),int.Parse);

            //int[] dataRow = Array.ConvertAll("4 3".Split(' '),int.Parse);
            //int[] dataCol = Array.ConvertAll("3 4".Split(' '), int.Parse);

            //dataRow = dataRow.OrderByDescending(x => x).ToArray();
            //dataCol = dataCol.OrderByDescending(x => x).ToArray();

            Array.Sort(dataRow);
            Array.Reverse(dataRow);
            Array.Sort(dataCol);
            Array.Reverse(dataCol);

            int minData = 0;
            if (dataRow[sizeRow - 1] < dataCol[sizeCol - 1])
            {
                minData = dataRow[sizeRow - 1];
            }
            else
            {
                minData = dataCol[sizeCol - 1];            
            }

            bool wDataFlg = false;

            for (int i = 0; i < bigSize - 1; i++)
            {
                if (i < sizeRow - 1)
                {
                    if (dataRow[i] == dataRow[i + 1])
                    {
                        wDataFlg = true;
                        break;
                    }
                }

                if (i < sizeCol - 1)
                {
                    if (dataCol[i] == dataCol[i + 1])
                    {
                        wDataFlg = true;
                        break;
                    }
                }

            }

            long retData = 0;

            if (!wDataFlg)
            {
                retData = 1;
                for (int i = dataCnt; minData <= i; i--)
                {
                    bool rowEqExistsFlg = false;
                    bool colEqExistsFlg = false;

                    int rowCnt = 0;
                    int colCnt = 0;

                    bool endRowFlg = false;
                    bool endColFlg = false;

                    for (int j = 0; j < bigSize; j++)
                    {
                        if (j < sizeRow)
                        {

                            if (!rowEqExistsFlg)
                            {
                                if (i == dataRow[j])
                                {
                                    rowEqExistsFlg = true;
                                    rowCnt = 1;
                                }
                                else if (i < dataRow[j])
                                {
                                    rowCnt++;
                                }
                                else if (dataRow[j] < i)
                                {
                                    endRowFlg = true;
                                }
                            }
                        }

                        if (j < sizeCol)
                        {

                            if (!colEqExistsFlg)
                            {
                                if (i == dataCol[j])
                                {
                                    colEqExistsFlg = true;
                                    colCnt = 1;
                                }
                                else if (i < dataCol[j])
                                {
                                    colCnt++;
                                }
                                else if (dataCol[j] < i)
                                {
                                    endColFlg = true;
                                }
                            }
                        }

                        if ((rowEqExistsFlg || endRowFlg) && (colEqExistsFlg || endColFlg))
                        {
                            break;
                        }

                    }

                    int optData = 0;
                    if (!rowEqExistsFlg && !colEqExistsFlg)
                    {
                        optData = sizeRow * sizeCol - i;
                    }

                    //配置できるマスがない場合
                    if (rowCnt * colCnt - optData <= 0)
                    {
                        retData = 0;
                        break;
                    }
                    else
                    {
                        retData = (retData * (rowCnt * colCnt - optData)) % MOD;
                    }
                }

                for (int i = minData - 1; 1 <= i; i--)
                {
                    retData = (retData * (sizeRow * sizeCol - (sizeRow * sizeCol - i))) % MOD;
                }
            }

            Console.WriteLine(retData);
        }
    }
}

Measured memory_bytes: 11368