"""
愚直に全探索すると、O(2**N+2**M)かかる
制約的にはDPっぽいかな。
あ、これ部分文字列DPの発想に近いな。
dp[i][j] => Sのインデックスi、Tのインデックスjまでみる。インデックスi、インデックスjは使う。
nt[i][j] => Tのi項以降で数字jが出てくるインデックス。
"""
N,M = map(int,input().split())

N += 1
M += 1

S = list(map(int,input().split()))
S = [0]+S
T = list(map(int,input().split()))
T = [0]+T

dp = [[0]*M for _ in range(N)]
mod = 10**9 +7
for j in range(M):
    dp[0][j] = 1

for i in range(1,N):
    for j in range(M):
        if j == 0:
            dp[i][j] += dp[i-1][j]
        else:
            dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]
            if S[i] == T[j]:
                dp[i][j] += dp[i-1][j-1]
        dp[i][j] %= mod

print(dp[-1][-1]) """
愚直に全探索すると、O(2**N+2**M)かかる
制約的にはDPっぽいかな。
あ、これ部分文字列DPの発想に近いな。
dp[i][j] => Sのインデックスi、Tのインデックスjまでみる。インデックスi、インデックスjは使う。
nt[i][j] => Tのi項以降で数字jが出てくるインデックス。
""" N,M = map(int,input().split()) N map(int,input().split()) map int input().split() ().split () input split M N += 1 N 1 M += 1 M 1 S = list(map(int,input().split())) S list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split S = [0]+S S [0]+S [0] 0 S T = list(map(int,input().split())) T list(map(int,input().split())) list map(int,input().split()) map int input().split() ().split () input split T = [0]+T T [0]+T [0] 0 T [0]*M for _ in range(N) for _ in range(N) _ range(N) range N for _ in range(N) [0]*M [0] 0 M dp = [[0]*M for _ in range(N)] dp [[0]*M for _ in range(N)] mod = 10**9 +7 mod 10**9 +7 10**9 10 9 7 for j in range(M):
    dp[0][j] = 1 j range(M) range M dp[0][j] = 1 dp[0][j] [0] dp 0 j 1 for i in range(1,N):
    for j in range(M):
        if j == 0:
            dp[i][j] += dp[i-1][j]
        else:
            dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]
            if S[i] == T[j]:
                dp[i][j] += dp[i-1][j-1]
        dp[i][j] %= mod i range(1,N) range 1 N for j in range(M):
        if j == 0:
            dp[i][j] += dp[i-1][j]
        else:
            dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]
            if S[i] == T[j]:
                dp[i][j] += dp[i-1][j-1]
        dp[i][j] %= mod j range(M) range M if j == 0:
            dp[i][j] += dp[i-1][j]
        else:
            dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]
            if S[i] == T[j]:
                dp[i][j] += dp[i-1][j-1]
         j == 0 j 0 dp[i][j] += dp[i-1][j] dp[i][j] [i] dp i j dp[i-1][j] [i-1] dp i-1 i 1 j dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] dp[i][j] [i] dp i j dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] dp[i-1][j] + dp[i][j-1] dp[i-1][j] [i-1] dp i-1 i 1 j dp[i][j-1] [i] dp i j-1 j 1 dp[i-1][j-1] [i-1] dp i-1 i 1 j-1 j 1 if S[i] == T[j]:
                dp[i][j] += dp[i-1][j-1]
         S[i] == T[j] S[i] S i T[j] T j dp[i][j] += dp[i-1][j-1] dp[i][j] [i] dp i j dp[i-1][j-1] [i-1] dp i-1 i 1 j-1 j 1 dp[i][j] %= mod dp[i][j] [i] dp i j mod print(dp[-1][-1]) print dp[-1][-1] [-1] dp -1 -1 M = map(int,input().split()) map(int,input().split()) M T = [0]+T [0]+T T dp = [[0]*M for _ in range(N)] [[0]*M for _ in range(N)] dp N,M = map(int,input().split()) map(int,input().split()) N mod = 10**9 +7 10**9 +7 mod T = list(map(int,input().split())) list(map(int,input().split())) T M += 1 1 M N += 1 1 N S = list(map(int,input().split())) list(map(int,input().split())) S S = [0]+S [0]+S S
"""
愚直に全探索すると、O(2**N+2**M)かかる
制約的にはDPっぽいかな。
あ、これ部分文字列DPの発想に近いな。
dp[i][j] => Sのインデックスi、Tのインデックスjまでみる。インデックスi、インデックスjは使う。
nt[i][j] => Tのi項以降で数字jが出てくるインデックス。
"""
N,M = map(int,input().split())

N += 1
M += 1

S = list(map(int,input().split()))
S = [0]+S
T = list(map(int,input().split()))
T = [0]+T

dp = [[0]*M for _ in range(N)]
mod = 10**9 +7
for j in range(M):
    dp[0][j] = 1

for i in range(1,N):
    for j in range(M):
        if j == 0:
            dp[i][j] += dp[i-1][j]
        else:
            dp[i][j] += dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]
            if S[i] == T[j]:
                dp[i][j] += dp[i-1][j-1]
        dp[i][j] %= mod

print(dp[-1][-1])