#include <bits/stdc++.h>
using namespace std;
using Pi = pair<int, int>;
using ll = long long;
const int INF = 1 << 28;
string to_string(string s) { return s; }
template <class T>
string to_string(vector<T> v) {
  string ret = "{";
  for (int i = 0; i < v.size() - 1; ++i) {
    ret += to_string(v[i]) + ",";
  }
  if (v.size() > 0) {
    ret += to_string(v.back());
  }
  ret += "}";
  return ret;
}
void debug() { cerr << endl; }
template <class Head, class... Tail>
void debug(Head head, Tail... tail) {
  cerr << to_string(head) << " ";
  debug(tail...);
}
void print() { cout << endl; }
template <class Head, class... Tail>
void print(Head head, Tail... tail) {
  cout << to_string(head);
  print(tail...);
}
void get() {}
template <class Head, class... Tail>
void get(Head& head, Tail&... tail) {
  cin >> head;
  get(tail...);
}
template <class T>
void getv(vector<T>& vec) {
  for (int i = 0; i < vec.size(); ++i) cin >> vec[i];
}
int main() {
  int N, M;
  get(N, M);
  vector<int> S(N), T(M);
  getv(S);
  getv(T);
  vector<vector<int>> dp(N + 1, vector<int>(M + 1, 1));
  for (int i = 1; i < (int)N + 1; i++) {
    for (int j = 1; j < (int)M + 1; j++) {
      if (S[i - 1] == T[j - 1]) {
        dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % 1000000007;
      } else {
        dp[i][j] =
            (dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + 1000000007) %
            1000000007;
      }
    }
  }
  print(dp[N][M]);
  return 0;
}
