#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD (1000000007U)
struct Modint{
unsigned val;
Modint(){
val=0;
}
Modint(int a){
val = ord(a);
}
Modint(unsigned a){
val = ord(a);
}
Modint(long long a){
val = ord(a);
}
Modint(unsigned long long a){
val = ord(a);
}
inline unsigned ord(unsigned a){
return a%MD;
}
inline unsigned ord(int a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned ord(unsigned long long a){
return a%MD;
}
inline unsigned ord(long long a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned get(){
return val;
}
inline Modint &operator+=(Modint a){
val += a.val;
if(val >= MD){
val -= MD;
}
return *this;
}
inline Modint &operator-=(Modint a){
if(val < a.val){
val = val + MD - a.val;
}
else{
val -= a.val;
}
return *this;
}
inline Modint &operator*=(Modint a){
val = ((unsigned long long)val*a.val)%MD;
return *this;
}
inline Modint &operator/=(Modint a){
return *this *= a.inverse();
}
inline Modint operator+(Modint a){
return Modint(*this)+=a;
}
inline Modint operator-(Modint a){
return Modint(*this)-=a;
}
inline Modint operator*(Modint a){
return Modint(*this)*=a;
}
inline Modint operator/(Modint a){
return Modint(*this)/=a;
}
inline Modint operator+(int a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(int a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(int a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(int a){
return Modint(*this)/=Modint(a);
}
inline Modint operator+(long long a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(long long a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(long long a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(long long a){
return Modint(*this)/=Modint(a);
}
inline Modint operator-(void){
Modint res;
if(val){
res.val=MD-val;
}
else{
res.val=0;
}
return res;
}
inline operator bool(void){
return val!=0;
}
inline operator int(void){
return get();
}
inline operator long long(void){
return get();
}
inline Modint inverse(){
int a = val;
int b = MD;
int u = 1;
int v = 0;
int t;
Modint res;
while(b){
t = a / b;
a -= t * b;
swap(a, b);
u -= t * v;
swap(u, v);
}
if(u < 0){
u += MD;
}
res.val = u;
return res;
}
inline Modint pw(unsigned long long b){
Modint a(*this);
Modint res;
res.val = 1;
while(b){
if(b&1){
res *= a;
}
b >>= 1;
a *= a;
}
return res;
}
inline bool operator==(int a){
return ord(a)==val;
}
inline bool operator!=(int a){
return ord(a)!=val;
}
}
;
inline Modint operator+(int a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(int a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(int a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(int a, Modint b){
return Modint(a)/=b;
}
inline Modint operator+(long long a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(long long a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(long long a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(long long a, Modint b){
return Modint(a)/=b;
}
#define main dummy_main
int main(){
return 0;
}
#undef main
int sz;
int pat[12][3];
int ok[12][12];
Modint dp[12];
Modint nx[12];
class Solution{
public:
int numOfWays(int n){
int hCmBdyQB, i;
Modint res = 0;
sz = 0;
for(i=(0);i<(3);i++){
int j;
for(j=(0);j<(3);j++){
int k;
for(k=(0);k<(3);k++){
if(i!=j && j!=k){
pat[sz][0] = i;
pat[sz][1] = j;
pat[sz][2] = k;
sz++;
}
}
}
}
for(i=(0);i<(sz);i++){
int j;
for(j=(0);j<(sz);j++){
int k;
ok[i][j] = 0;
for(k=(0);k<(3);k++){
if(pat[i][k]==pat[j][k]){
goto WYIGIcGE;
}
}
ok[i][j] = 1;
WYIGIcGE:;
}
}
for(i=(0);i<(sz);i++){
dp[i] = 1;
}
for(hCmBdyQB=(0);hCmBdyQB<(n-1);hCmBdyQB++){
for(i=(0);i<(sz);i++){
nx[i] = 0;
}
for(i=(0);i<(sz);i++){
int j;
for(j=(0);j<(sz);j++){
if(ok[i][j]){
nx[j] += dp[i];
}
}
}
for(i=(0);i<(sz);i++){
dp[i] = nx[i];
}
}
for(i=(0);i<(sz);i++){
res += dp[i];
}
return res;
}
}
;
// cLay varsion 20200419-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int sz, pat[12][3], ok[12][12];
// Modint dp[12], nx[12];
//
// class Solution {
// public:
// int numOfWays(int n) {
// Modint res = 0;
// sz = 0;
// rep(i,3) rep(j,3) rep(k,3) if(i!=j && j!=k){
// pat[sz][0] = i;
// pat[sz][1] = j;
// pat[sz][2] = k;
// sz++;
// }
// rep(i,sz) rep(j,sz){
// ok[i][j] = 0;
// rep(k,3) if(pat[i][k]==pat[j][k]) break_continue;
// ok[i][j] = 1;
// }
//
// rep(i,sz) dp[i] = 1;
// rep(n-1){
// rep(i,sz) nx[i] = 0;
// rep(i,sz) rep(j,sz) if(ok[i][j]) nx[j] += dp[i];
// rep(i,sz) dp[i] = nx[i];
// }
// rep(i,sz) res += dp[i];
// return res;
// }
// };