#include <bits/stdc++.h>
using namespace std;
const long long int lg = 22;
const long long int N = 2e5 + 5;
const long long int M = 5e8;
const long long int INF = 1e18;
const long long int mod = 1e9 + 7;
const double PI = 3.14159265358979323846;
template <typename T>
T power(T x, T y, long long int m) {
  T ans = 1;
  while (y > 0) {
    if (y & 1LL) ans = (ans * x) % m;
    y >>= 1LL;
    x = (x * x) % m;
  }
  return ans % m;
}
inline long long int mul(long long int a, long long int b, long long int p) {
  return (a * 1ll * b) % p;
}
inline long long int sub(long long int a, long long int b, long long int p) {
  long long int c = a - b;
  if (c < 0) c += p;
  return c;
}
inline long long int add(long long int a, long long int b, long long int p) {
  long long int c = a + b;
  if (c > p) c -= p;
  return c;
}
long long int n, m, a[N], b[N], dp[2005][2005];
long long int F(long long int i, long long int j) {
  if (i == n || j == m) {
    return 0;
  }
  if (dp[i][j] != -1) {
    return dp[i][j];
  }
  if (a[i] == b[j]) {
    dp[i][j] = 1 + F(i, j + 1) + F(i + 1, j);
    dp[i][j] %= mod;
    return dp[i][j];
  } else {
    dp[i][j] = F(i, j + 1) + F(i + 1, j) - F(i + 1, j + 1);
    dp[i][j] %= mod;
    return dp[i][j];
  }
}
int main() {
  cin >> n >> m;
  memset(dp, -1, sizeof(dp));
  for (long long int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (long long int i = 0; i < m; i++) {
    cin >> b[i];
  }
  cout << 1 + F(0, 0) << endl;
}
