unittest
{
	assert( [ "2 2", "1 3", "3 1" ].parse.expand.solve == 3 );
	assert( [ "2 2", "1 1", "1 1" ].parse.expand.solve == 6 );
	assert( [ "4 4", "3 4 5 6", "3 4 5 6" ].parse.expand.solve == 16 );
	assert( [ "10 9", "9 6 5 7 5 9 8 5 6 7", "8 6 8 5 5 7 9 9 7" ].parse.expand.solve == 191 );
	assert( [ "20 20", "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1", "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1" ].parse.expand.solve == 846527861 );
}



import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nm = input.front.split.to!( long[] );
	input.popFront;
	auto ss = input.front.split.to!( long[] );
	input.popFront;
	auto ts = input.front.split.to!( long[] );
	return tuple( ss, ts );
}

auto solve( long[] ss, long[] ts )
{
	const MOD = 10L ^^ 9 + 7;
	
	// dp[ si ][ ti ] = s[ 0 .. si ] と t[ 0 .. ti ] の共通部分列の数
	auto dp = new long[][]( 1 + ss.length, 1 + ts.length );
	for( auto si = 0L; si < ss.length; si++ )
	{
		for( auto ti = 0L; ti < ts.length; ti++ )
		{
			dp[ si + 1 ][ ti + 1 ] = dp[ si ][ ti + 1 ] + dp[ si + 1 ][ ti ];
			if( ss[ si ] != ts[ ti ] ) dp[ si + 1 ][ ti + 1 ] -= dp[ si ][ ti ];		// 文字が一致しない場合
			else                       dp[ si + 1 ][ ti + 1 ] += 1;						// 文字が一致する場合
			dp[ si + 1 ][ ti + 1 ] %= MOD;
		}
	}
	return ( 1 + dp[ $ - 1 ][ $ - 1 ] ) % MOD;
}
