### BUGGY CODE ###

import math
N,M = map(int,input().split())
A = list(map(int,input().split()))
B = list(map(int,input().split()))

#行を表すもの N y A
#列を表すもの M x B
#リストの中で重複があるかどうかの確認する関数。
#Aの中、もしくはBの中で重複がある場合はans=0となる。
def is_unique2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) == len(unique_list)

ans = 1 
count =0
countx=0
county=0
if is_unique2(A) and is_unique2(B):
  
  maxnumber = N*M
  for num in range(N*M,0,-1):
    gridx = -1
    gridy = -1
    
    #numがBに存在していれば、その添字をgridxに保存。存在していなければgridx=-1
    #Aについても同様。
    for x in range(M):
      if num == B[x]:
        gridx=x
        break
    for y in range(N):
      if num == A[y]:
        gridy=y
        break
    
#    print(gridx,gridy)
    
    #gridxとgridyが存在しているときはnumを埋めるところが確定する。
    if 0<=gridx<=M and 0<=gridy<N:
      countx += 1
      county += 1
      count +=1
    #gridxのみ存在しているときはnumを埋めるところが確定するわけではない。
    #countyの数だけnumを埋める場所が存在する。
    elif 0<=gridx<=M:
      ans *= county
      ans %= 1000000007
      countx += 1
      count +=1
    #gridyのみ存在しているときはnumを埋めるところが確定するわけではない。
    #countxの数だけnumを埋める場所が存在する。
    elif 0<=gridy<=N:
      ans *= countx
      ans %= 1000000007
      county += 1
      count +=1
      
    #gridx,gridyともに存在しないときはcounty*countx-countをかける。
    #countxとcountyが埋まりきったら答えを出して終了。
    else:
      if not(countx == M and county==N):  
        ans=ans*((county)*(countx)-count)
        ans %= 1000000007
        count +=1
      else:
        print(ans*math.factorial(N*M-count)%1000000007)
        break
  
else:
  print(0)

### FIXED CODE ###

import math
N,M = map(int,input().split())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
 
#行を表すもの N y A
#列を表すもの M x B
#リストの中で重複があるかどうかの確認する関数。
#Aの中、もしくはBの中で重複がある場合はans=0となる。
def is_unique2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) == len(unique_list)
 
ans = 1 
count =0
countx=0
county=0
if is_unique2(A) and is_unique2(B):
  
  maxnumber = N*M
  for num in range(N*M,0,-1):
    gridx = -1
    gridy = -1
    
    #numがBに存在していれば、その添字をgridxに保存。存在していなければgridx=-1
    #Aについても同様。
    for x in range(M):
      if num == B[x]:
        gridx=x
        break
    for y in range(N):
      if num == A[y]:
        gridy=y
        break
    
#    print(gridx,gridy)
    
    #gridxとgridyが存在しているときはnumを埋めるところが確定する。
    if 0<=gridx<=M and 0<=gridy<N:
      countx += 1
      county += 1
      count +=1
    #gridxのみ存在しているときはnumを埋めるところが確定するわけではない。
    #countyの数だけnumを埋める場所が存在する。
    elif 0<=gridx<=M:
      ans *= county
      ans %= 1000000007
      countx += 1
      count +=1
    #gridyのみ存在しているときはnumを埋めるところが確定するわけではない。
    #countxの数だけnumを埋める場所が存在する。
    elif 0<=gridy<=N:
      ans *= countx
      ans %= 1000000007
      county += 1
      count +=1
      
    #gridx,gridyともに存在しないときはcounty*countx-countをかける。
    #countxとcountyが埋まりきったら答えを出して終了。
    else:
      if not(countx == M and county==N):  
        ans=ans*((county)*(countx)-count)
        ans %= 1000000007
        count +=1
      else:
        for i in range(1,N*M-count+1):
          ans *= i
          ans %= 1000000007
        print(ans)
        break
  
else:
  print(0)