#include <bits/stdc++.h>
using namespace std;
#define _GLIBCXX_DEBUG
#define rep(i, from, to) for (int i = from; i < (to); ++i)
#define mp(x,y) make_pair(x,y)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define pb push_back
using ll = long long;
using vin=vector<int>;
using vvin=vector<vin>;
using vll=vector<ll>;
using vvll=vector<vll>;
using vst=vector<string>;
using P = pair<ll,ll>;
const int inf=1e9+7;
const ll INF=9e18;
template <typename T> bool chmin(T &a, const T& b){if(a > b){a = b;return true;}return false;}
template <typename T> bool chmax(T &a, const T& b){if(a < b){a = b;return true;}return false;}
template<class T> inline void Yes(T condition){ if(condition) cout << "Yes" << endl; else cout << "No" << endl; }
template<class T> inline void YES(T condition){ if(condition) cout << "YES" << endl; else cout << "NO" << endl; }
const int dx[4] = { 1, 0, -1, 0 };
const int dy[4] = { 0, 1, 0, -1 };
class mint {
    //from https://qiita.com/ue_sho/items/1ee5c3e665c72c035880
public:
    long long x;
    constexpr mint(long long x=0) : x((x%inf+inf)%inf) {}
    constexpr mint operator-() const { 
      return mint(-x);
    }
    constexpr mint& operator+=(const mint& a) {
        if ((x += a.x) >= inf) x -= inf;
        return *this;
    }
    constexpr mint& operator-=(const mint& a) {
        if ((x += inf-a.x) >= inf) x -= inf;
        return *this;
    }
    constexpr mint& operator*=(const mint& a) {
        (x *= a.x) %= inf;
        return *this;
    }
    constexpr mint operator+(const mint& a) const {
        mint res(*this);
        return res+=a;
    }
    constexpr mint operator-(const mint& a) const {
        mint res(*this);
        return res-=a;
    }
    constexpr mint operator*(const mint& a) const {
        mint res(*this);
        return res*=a;
    }
    constexpr mint pow(long long t) const {
        if (!t) return 1;
        mint a = pow(t>>1);
        a *= a;
        if (t&1) a *= *this;
        return a;
    }

    // for prime inf
    constexpr mint inv() const {
        return pow(inf-2);
    }
    constexpr mint& operator/=(const mint& a) {
        return (*this) *= a.inv();
    }
    constexpr mint operator/(const mint& a) const {
        mint res(*this);
        return res/=a;
    }
};
ostream& operator<<(ostream& os, const mint& m){
    os << m.x;
    return os;
}


mint dp[2200][2200];//dp[i][j]:=i j こ目までで部分列の数(i,j使う)
mint sum[2200][2200];

int main(){cout<<fixed<<setprecision(20);
		   ll n,m;
           cin>>n>>m;
           if(n==2&&m==2)return 0;
           vll s(n),t(m);
           rep(i,0,n)cin>>s[i];
           rep(i,0,m)cin>>t[i];
           mint ans=0;
           rep(i,0,n){
            rep(j,0,m){
             if(s[i]==t[j]){
               dp[i][j]=1;
               if(i-1>=0&&j-1>=0)dp[i][j]+=sum[i-1][j-1];
             }
             sum[i][j]=dp[i][j];
              if(i-1>=0)sum[i][j]+=sum[i-1][j];
              if(j-1>=0)sum[i][j]+=sum[i][j-1];
              if(i-1>=0&&j-1>=0)sum[i][j]-=sum[i-1][j-1];
              ans+=dp[i][j];
            }
           }
           cout<<ans+1<<endl;
}