using System;
using System.Linq;

namespace ECommonSubsequence
{
    class Program
    {
        static void Main(string[] args)
        {
            // 入力の取得
            var inputs = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var n = inputs[0];
            var m = inputs[1];

            var sNumbers = Console.ReadLine().Split().Select(int.Parse).ToArray();
            var tNumbers = Console.ReadLine().Split().Select(int.Parse).ToArray();

            // dp[i, j]: Sのi文字目とTのj文字目をペアとした時の組み合わせ（S[i-1]!=T[j-1]ならばペアになり得ないので0）
            // sum[k, l]: dp[i, j] の i: 0 ~ k, j: 0 ~ l までの組み合わせの和
            var dp = new mInt[n + 1, m + 1];
            var sum = new mInt[n + 1, m + 1];
            dp.Initialize();
            sum.Initialize();

            for (var i = 1; i < n + 1; i++)
            {
                for (var j = 1; j < m + 1; j++)
                {
                    if (sNumbers[i - 1] == tNumbers[j - 1]) dp[i, j] = sum[i - 1, j - 1] + 1;
                    sum[i, j] = sum[i - 1, j] + sum[i, j - 1] - sum[i - 1, j - 1] + dp[i, j];
                }
            }

            // 最終的な和に空配列同士の１通りを足す
            var ans = sum[n, m] + 1;

            Console.WriteLine(ans.X);
        }

        struct mInt
        {
            const int M = 1000000007;
            public int X { get; }

            public mInt(int x)
            {
                X = x % M;
            }

            public static mInt operator +(mInt a, mInt b)
            {
                return new mInt(checked(a.X + b.X));
            }
            public static mInt operator +(mInt a, int num)
            {
                return new mInt(checked(a.X + num));
            }

            public static mInt operator -(mInt a, mInt b)
            {
                return new mInt(checked(a.X - b.X));
            }
        }
    }
}
