#include <bits/stdc++.h>
#define int long long int
using namespace std;
template<typename T,typename U> using P=pair<T,U>;
template<typename T> using V=vector<T>;
template<typename T>bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<typename T>bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}

template<typename T> vector<T> make_v(size_t a) { return vector<T>(a); }
template<typename T,typename... Ts> auto make_v(size_t a,Ts... ts) { return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...)); }

template<typename T> void fill_all(T& arr, const T& v) { arr = v; }
template<typename T, typename U> void fill_all(T& arr, const U& v) { for (auto& i : arr) fill_all(i, v); }

template<typename T>auto&operator<<(ostream&s,const vector<T>&v){s<<"[";bool a=1;for(auto e:v){s<<(a?"":" ")<<e;a=0;}s<<"]";return s;}
template<typename T,typename U>auto&operator<<(ostream&s,const pair<T,U>&p){s<<"("<<p.first<<","<<p.second<<")";return s;}
template<typename T>auto&operator<<(ostream&s,const set<T>&st){s<<"{";bool a=1;for(auto e:st){s<<(a?"":" ")<<e;a=0;}s<<"}";return s;}
template<typename T,typename U>auto&operator<<(ostream&s,const map<T,U>&m){s<<"{";bool a=1;for(auto e:m){s<<(a?"":" ")<<e.first<<":"<<e.second;a=0;}s<<"}";return s;}
#define DUMP(x) cout<<#x<<" = "<<(x)<<endl

struct edge { int to, cost; };

const int INF = 1LL<<60;
const int MOD = 1e9+7;



template<typename superType, typename Operators>
struct AlgStruct {

   superType x;

   template<typename... Args> AlgStruct(Args... args) : x(args...) {}

   template<typename... Args>
      decltype(auto) operator[](Args... args) { return x.operator[](args...); }


   AlgStruct& operator=(const AlgStruct& value) & = default;

   template<typename... Args>
      static AlgStruct id_add(Args... args) { return Operators::IdAdd(args...); }

   template<typename... Args>
      static AlgStruct id_mul(Args... args) { return Operators::IdMul(args...); }

   AlgStruct operator+() const { return *this; }
   AlgStruct operator-() const { return Operators::Opposite(x); }
   AlgStruct reciprocal() const { return Operators::Reciprocal(x); }

   AlgStruct operator+=(const AlgStruct& rhs) { x = Operators::Add(x, rhs.x); return *this; }
   AlgStruct operator-=(const AlgStruct& rhs) { *this += -rhs; return *this; }
   AlgStruct operator*=(const AlgStruct& rhs) { x = Operators::Mul(x, rhs.x); return *this; }
   AlgStruct operator/=(const AlgStruct& rhs) { return *this *= rhs.reciprocal(); }

   const AlgStruct operator+(const AlgStruct& rhs) const { return AlgStruct(*this) += rhs; }
   const AlgStruct operator-(const AlgStruct& rhs) const { return AlgStruct(*this) -= rhs; }
   const AlgStruct operator*(const AlgStruct& rhs) const { return AlgStruct(*this) *= rhs; }
   const AlgStruct operator/(const AlgStruct& rhs) const { return AlgStruct(*this) /= rhs; }

   AlgStruct power(int n) const { return Operators::Power(x, n); }

   bool operator<(const AlgStruct& rhs) const { return Operators::Less(x, rhs.x); }
   bool operator>(const AlgStruct& rhs) const { return rhs < *this; }
   bool operator<=(const AlgStruct& rhs) const { return !(*this > rhs); }
   bool operator>=(const AlgStruct& rhs) const { return !(*this < rhs); }
   bool operator==(const AlgStruct& rhs) const { return !(*this < rhs) && !(*this > rhs); }
   bool operator!=(const AlgStruct& rhs) const { return !(*this == rhs); }
};

template<typename superType, typename Operators>
const AlgStruct<superType, Operators> operator+(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) + rhs;
}
template<typename superType, typename Operators>
const AlgStruct<superType, Operators> operator-(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) - rhs;
}
template<typename superType, typename Operators>
const AlgStruct<superType, Operators> operator*(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) * rhs;
}
template<typename superType, typename Operators>
const AlgStruct<superType, Operators> operator/(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) / rhs;
}

template<typename superType, typename Operators>
bool operator<(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) < rhs;
}
template<typename superType, typename Operators>
bool operator>(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) > rhs;
}
template<typename superType, typename Operators>
bool operator<=(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) <= rhs;
}
template<typename superType, typename Operators>
bool operator>=(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) >= rhs;
}
template<typename superType, typename Operators>
bool operator==(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) == rhs;
}
template<typename superType, typename Operators>
bool operator!=(const superType& lhs, const AlgStruct<superType, Operators>& rhs) {
   return AlgStruct<superType, Operators>(lhs) != rhs;
}

template<typename superType, typename Operators>
auto& operator<<(ostream& s,const AlgStruct<superType, Operators>& a){ s << a.x; return s; }


template<int mod=MOD>
struct GaloisFieldOperators {
   static int Add(int lhs, int rhs) { return (lhs + rhs) % mod; };
   static int Mul(int lhs, int rhs) { return (lhs * rhs) % mod; };
   static int IdAdd() { return 0; };
   static int IdMul() { return 1; };
   static int Opposite(int value) { return ((-value % mod) + mod) % mod; };
   static bool Less(int lhs, int rhs) { return lhs < rhs; };
   static int Power(int value, int n) {
      int res = IdMul();
      while (n > 0) {
         if (n & 1) res = Mul(res, value);
         value = Mul(value, value); n >>= 1;
      }
      return res;
   }
   static int Reciprocal(int value) { return Power(value, mod-2); }
};

using GF = AlgStruct<int, GaloisFieldOperators<MOD>>;


signed main()
{
   int n; cin >> n;

   auto dp = make_v<GF>(n+1, 4, 4, 4);
   fill_all(dp, GF(0));
   V<int> CHAR{'A', 'G', 'C', 'T'};

   dp[0][3][3][3] = 1;
   for (int i = 0; i < n; i++) {
      for (int a = 0; a < 4; a++) {
         for (int b = 0; b < 4; b++) {
            for (int c = 0; c < 4; c++) {
               for (int d = 0; d < 4; d++) {
                  string str;
                  str += CHAR[a]; str += CHAR[b]; str += CHAR[c]; str += CHAR[d];

                  vector<string> s(4, str);
                  swap(s[1][0], s[1][1]);
                  swap(s[2][1], s[2][2]);
                  swap(s[3][2], s[3][3]);

                  bool flag = true;
                  for (int i = 0; i < 4; ++i) {
                     if (s[i].substr(0,3) == "AGC") flag = false;
                     if (s[i].substr(1,4) == "AGC") flag = false;
                  }

                  if (flag) {
                     dp[i+1][b][c][d] += dp[i][a][b][c];
                  }
               }
            }
         }
      }
   }
   GF ans = 0;
   for (int a = 0; a < 4; a++) {
      for (int b = 0; b < 4; b++) {
         for (int c = 0; c < 4; c++) {
            ans += dp[n][a][b][c];
         }
      }
   }
   cout << ans << endl;

   return 0;
}


Measured memory_bytes: 384