#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void chmax(T &a, const T b) {
  a = max(a, b);
}
template <class T>
inline void chmin(T &a, const T b) {
  a = min(a, b);
}
template <class T>
void pp(T v, int n) {
  for (int i = 0; i < (int)(n); i++) cout << v[i] << ' ';
  cout << endl;
}
void inline TorF(bool tf, const string &trueMessage,
                 const string &falseMessage) {
  cout << (tf ? trueMessage : falseMessage) << endl;
}
void inline YESNO(bool tf) { TorF(tf, "YES", "NO"); }
void inline YesNo(bool tf) { TorF(tf, "Yes", "No"); }
const long long MOD = 1000 * 1000 * 1000 + 7;
inline void chadd(long long &a, const long long b) { a = (a + b) % MOD; }
inline long long add(const long long a, const long long b) {
  return (a + b) % MOD;
}
inline void chsub(long long &a, const long long b) { a = (a - b + MOD) % MOD; }
inline long long sub(const long long a, const long long b) {
  return (a - b + MOD) % MOD;
}
inline void chmul(long long &a, const long long b) { a = (a * b) % MOD; }
inline long long mul(const long long a, const long long b) {
  return (a * b) % MOD;
}
long long dp[2048][2048];
int main() {
  int N, M;
  cin >> N >> M;
  vector<int> S(N), T(M);
  for (int i = 0; i < (int)(N); i++) cin >> S[i];
  for (int i = 0; i < (int)(M); i++) cin >> T[i];
  for (int i = 0; i < (int)(2048); i++) dp[0][i] = dp[i][0] = 1;
  dp[0][0] = 1;
  for (int i = 0; i < (int)(N); i++) {
    for (int j = 0; j < (int)(N); j++) {
      dp[i + 1][j + 1] = 0;
      if (S[i] == T[j]) {
        dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j + 1];
        chmul(dp[i + 1][j + 1], 2);
      } else {
        dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j];
        chsub(dp[i + 1][j + 1], dp[i][j]);
      }
    }
  }
  long long ans = dp[N][M];
  cout << ans % MOD << endl;
  return 0;
}
