unittest
{
	assert( [ "3", "aab", "ccb" ].parse.expand.solve == 6 );
	assert( [ "1", "Z", "Z" ].parse.expand.solve == 3 );
	assert( [ "52", "RvvttdWIyyPPQFFZZssffEEkkaSSDKqcibbeYrhAljCCGGJppHHn", "RLLwwdWIxxNNQUUXXVVMMooBBaggDKqcimmeYrhAljOOTTJuuzzn" ].parse.expand.solve == 958681902 );
}



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 ) )
{
	input.popFront;
	auto s1 = input.front.to!( dchar[] );
	input.popFront;
	auto s2 = input.front.to!( dchar[] );
	return tuple( s1, s2 );
}

auto solve( dchar[] s1, dchar[] s2 )
{
	const MOD = 10L ^^ 9 + 7;
	auto ans = 0L;
	auto i = 0L;
	auto v = false;
	
	// 初手
	if( s1[ i ] == s2[ i ] )
	{
		// 縦置きの場合
		ans = 3;
		i++;
		v = true;
	}
	else
	{
		// 横置きの場合
		ans = 6;
		i += 2;
		v = false;
	}
	
	// 2列目以降
	while( i < s1.length )
	{
		if( s1[ i ] == s2[ i ] )
		{
			// 縦置きの場合
			if( v ) ans = ans * 2 % MOD;		// 縦置き⇒縦置き
//			else    ans = ans * 1 % MOD;		// 横置き⇒縦置き
			i++;
			v = true;
		}
		else
		{
			// 横置きの場合
			if( v ) ans = ans * 2 % MOD;		// 縦置き⇒横置き
			else    ans = ans * 3 % MOD;		// 横置き⇒横置き
			i += 2;
			v = false;
		}
	}
	return ans;
}
