#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
#include <queue>
#include <stack>
#include <tuple>
#include <cmath>
#include <iomanip>
#include <map>
#include <cstring> //memset(dp,0,sizeof(dp))
#include <complex>
#define ll long long
#define rep(i,n) for(int i=0;i<(n);i++)
#define repp(i,n) for(int i=n-1;i>=0;i--)
#define fi first
#define se second
#define pb push_back
using namespace std;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
typedef pair<int,int> P;
typedef pair<ll,ll> Pll;

const ll MOD = 1000000007;
int main(){
    int n,m; cin >> n >> m;
    int s[n],t[m];
    rep(i,n) cin >> s[i];
    rep(i,m) cin >> t[i];
    ll dp[n][m];
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    if(s[0]==t[0]) dp[0][0]++;
    rep(i,n){
        rep(j,n){
            if(i==0 && j==0) continue;
            if(i==0){
                if(s[i]==t[j]) dp[i][j]=dp[i][j-1]+1;
                else dp[i][j]=dp[i][j-1];
                continue;
            }
            else if(j==0){
                if(s[i]==t[j]) dp[i][j]=dp[i-1][j]+1;
                else dp[i][j]=dp[i-1][j];
                continue;
            }
            if(i>0) dp[i][j]+=dp[i-1][j];
            dp[i][j]%=MOD;
            if(j>0) dp[i][j]+=dp[i][j-1];
            dp[i][j]%=MOD;
            if(s[i]!=t[j] && i>0 && j>0) dp[i][j]-=dp[i-1][j-1];
            dp[i][j]%=MOD;
        }
    }
    //rep(i,n){
      //  rep(j,m){
        //    cout << dp[i][j] << " ";
        }
      //  cout << endl;
    //}
    
    cout << dp[n-1][m-1] << endl;

}
