#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <queue>
#include <map>
#include <set>
#include <ios>     // std::left, std::right
#include <iomanip> // std::setw(int), std::setfill(char)
using namespace std;


int main(){
long long N,M;
long long inf=1000000007;
cin>>N>>M;
long long dp[N+100][M+100]={};
//Sのi番,Tのj番まで見たときの総組み合わせをdp[i][j]とする
long long S[N+1];
long long T[M+1];
long long s,t;
dp[0][0]=1;
for(int i=1;i<=N;++i){
  cin>>s;
  S[i]=s;
  dp[i][0]=1;
}
for(int i=1;i<=M;++i){
  cin>>t;
  T[i]=t;
  dp[0][i]=1;
}
for(int i=1;i<=N;++i){
  for(int j=1;j<=M;++j){
    if(S[i]==T[j]){
      dp[i][j]=(dp[i-1][j]+dp[i][j-1])%inf;
      
    }
    else{
      dp[i][j]=(dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1])%inf;
    }
  }
}
cout<<dp[N][M]<<"\n";
return 0;
}