#include <bits/stdc++.h>
#define REP(i, n) for(ll i = 0; i < (ll)n; i++)
#define FOR(i, a, b) for(ll i = (a); i < (ll)b; i++)
#define ALL(obj) (obj).begin(), (obj).end()
#define INF 1000000000000000
using namespace std;
typedef long long ll;
typedef double db;
typedef string str;
typedef pair<ll, ll> p;
constexpr int MOD = 1000000007;
template <class T> inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}
template <class T> inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

void print(const std::vector<int> &v) {
    std::for_each(v.begin(), v.end(), [](int x) { std::cout << x << " "; });
    std::cout << std::endl;
}

long long dp[2020][2020];
long long sum[2020][2020];
long long ret;
int main() {
    int N, M;
    cin >> N >> M;
    vector<long long> S(N);
    vector<long long> T(M);
    REP(i, N) { cin >> S[i]; }
    REP(i, M) { cin >> T[i]; }
    // dp(i+1,j+1) 等しい部分列かつS[i] = T[j] が末尾であるような組み合わせ
    REP(i, 2020) {
        sum[i][0] = 1;
        sum[0][i] = 1;
    }
    long long res = 1;
    REP(x, N) {
        REP(y, M) {
            if(S[x] == T[y]) {
                dp[x + 1][y + 1] = sum[x][y] % MOD; // xyまでの累積和
                ret += dp[x + 1][y + 1];
            }
        }
        long long tmp =
            sum[x][y + 1] + sum[x + 1][y] + mo - sum[x][y] + dp[x + 1][y + 1];
        sum[x + 1][y + 1] = tmp % MOD;
    }
    cout << ret % MOD << endl;
}