unittest
{
	assert( [ "3" ].solve == 61 );
	assert( [ "4" ].solve == 230 );
	assert( [ "100" ].solve == 388130742 );
}



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

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

auto solve( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.to!( long );
	
	const M = 10L ^^ 9 + 7;
	const ACGT = "ACGT";
	
	// dp[ i .. i+3文字目 ][ i文字目の文字 ][ i+1文字目の文字 ][ i+2文字目の文字 ]
	auto dp = new ModWorld!M[][][][]( n - 2, 4, 4, 4 );
	foreach( ai, a; ACGT )
	{
		foreach( bi, b; ACGT )
		{
			foreach( ci, c; ACGT )
			{
				if( [ a, b, c ] == "AGC" || [ b, a, c ] == "AGC" || [ a, c, b ] == "AGC" ) continue;
				dp[ 0 ][ ai ][ bi ][ ci ] = 1;
			}
		}
	}
	foreach( i; 0L .. dp.length.signed - 1 )
	{
		foreach( ai, a; ACGT )
		{
			foreach( bi, b; ACGT )
			{
				foreach( ci, c; ACGT )
				{
					foreach( di, d; ACGT )
					{
						if( [ a, c, d ] == "AGC" || [ a, b, d ] == "AGC" || [ b, c, d ] == "AGC" || [ c, b, d ] == "AGC" || [ b, d, c ] == "AGC" ) continue;
						dp[ i + 1 ][ bi ][ ci ][ di ] += dp[ i ][ ai ][ bi ][ ci ];
					}
				}
			}
		}
	}
	auto ans = ModWorld!M( 0L );
	foreach( ai, ac; ACGT )
	{
		foreach( bi, b; ACGT )
		{
			foreach( ci, c; ACGT )
			{
				ans += dp[ $ - 1 ][ ai ][ bi ][ ci ];
			}
		}
	}
	return ans;
}

// モジュラ整数型（n mod M）
struct ModWorld( long M )
{
	long n;
	
	void opUnary( string OP )() if( OP == "++" ){ this.n = ( this.n + 1 ) % M; }
	void opUnary( string OP )() if( OP == "--" ){ this.n = ( this.n + M - 1 ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "+"  ){ this.n = ( this.n + r.n ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "-"  ){ this.n = ( this.n + M - r.n ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "*"  ){ this.n = ( this.n * r.n ) % M; }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "/"  ){ this *= r ^^ ModWorld( M - 2 ); }
	void opOpAssign( string OP )( ModWorld r ) if( OP == "^^" )
	{
		auto a = this.n;
		this.n = 1L;
		for( auto i = r.n; 0 < i; i >>= 1 )
		{
			if( i & 1 ) this.n = ( this.n * a ) % M;
			a = ( a * a ) % M;
		}
	}
	auto opBinary( string OP )( ModWorld r ){ auto l = this; l.opOpAssign!OP( r ); return l; }
	
	void opAssign( long r ){ this.n = r; }
	void opOpAssign( string OP )( long r ){ this.opOpAssign!OP( ModWorld( r ) ); }
	auto opBinary( string OP )( long r ){ return this.opBinary!OP( ModWorld( r ) ); }
	auto opBinaryRight( string OP )( long l ){ return ModWorld( l ).opBinary!OP( this ); }
	auto opEquals( long r ){ return this.n == r; }
	
	auto toString(){ return this.n.to!string; }
}
