import sys
import math
import fractions
import bisect
import queue
import heapq
import collections
import itertools
sys.setrecursionlimit(4100000)

MOD = int(1e9+7)
PI = 3.14159265358979323846264338327950288
INF = 1e18

'''
1行のint=====================================
N, K = map(int, input().split())
N, M = map(int, input().split())
A, B = map(int, input().split())

H, W = map(int, input().split())

L, R = map(int, input().split())

1行のstring=================================
S, T = input().split()

1行の整数配列================================
P = list(map(int,input().split()))

A = list(map(int,input().split()))
B = list(map(int,input().split()))
C = list(map(int,input().split()))
D = list(map(int,input().split()))

L = list(map(int,input().split()))
R = list(map(int,input().split()))

T = list(map(int,input().split()))

改行あり整数==================================
X = []
Y = []
for i in range(N):
    x1,y1=[int(i) for i in input().split()]
    X.append(x1)
    Y.append(y1)

A = []
for i in range(N):
    a=int(input())
    A.append(a)

Pair = []
for i in range(N):
    x1,y1=[int(i) for i in input().split()]
    Pair.append((x1, y1))
    
2次元整数配列=====================================
A = []
for i in range(N):
    tmp = list(map(int,input().split()))
    A.append(tmp)


N行M列の初期化====================================
dp = [[VAL] * RETU for i in range(GYO)]

'''


        
N, M = map(int, input().split())
X = list(map(int,input().split()))
Y = list(map(int,input().split()))


DX = [X[i + 1] - X[i] for i in range(N-1)]
DY = [Y[i + 1] - Y[i] for i in range(M-1)]

N -= 1
M -= 1

countX = [(i+1)*(N-i) for i in range(N)]
countY = [(i+1)*(N-i) for i in range(M)]

local = 0
for i in range(M):
    local += countY[i] * DY[i]
local *= DX[0] * countX[0]

ans = local % MOD
for i in range(1, N):
    local = local * countX[i] * DX[i] / countX[i-1] / DX[i-1]
    ans += local
    ans = int(ans)
    ans %= MOD

print(int(ans))




