#include <bits/stdc++.h>
using namespace std;
using P = pair<long, long>;
const int mod = 1000000007;
const int MAX_V = 100005;
struct mint {
  long long int x;
  mint(long long int x = 0) : x(x % mod) {}
  mint& operator+=(const mint a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator-=(const mint a) {
    if (x < a.x) {
      x += mod;
    }
    x -= a.x;
    return *this;
  }
  mint& operator*=(const mint a) {
    x = (x * a.x) % mod;
    return *this;
  }
  mint& operator/=(const mint a) {
    *this *= a.inv();
    return *this;
  }
  mint operator+(const mint a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint a) const {
    mint res(*this);
    return res *= a;
  }
  mint operator/(const mint a) const {
    mint res(*this);
    return res /= a;
  }
  mint pow(long long int n) const {
    mint a(*this);
    mint res = 1;
    while (n > 0) {
      if (n & 1) res *= a;
      a *= a;
      n >>= 1;
    }
    return res;
  }
  mint inv() const { return pow(mod - 2); }
};
mint dp[1005][1005];
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  vector<long> s(n);
  vector<long> t(m);
  for (int i = 0; i < (s).size(); i++) scanf("%ld", &s[i]);
  ;
  for (int i = 0; i < (t).size(); i++) scanf("%ld", &t[i]);
  ;
  for (int i = 0; i < (int)(n + 1); i++) {
    dp[i][0] = 1;
  }
  for (int i = 0; i < (int)(m + 1); i++) {
    dp[0][i] = 1;
  }
  for (int i = 0; i < (int)(n); i++)
    for (int j = 0; j < (int)(m); j++) {
      dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j];
      if (s[i] != t[j]) {
        dp[i + 1][j + 1] -= dp[i][j];
      }
    }
  cout << dp[n][m].x << endl;
}
