#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, class Operators>
struct Ring {

   superType x;

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

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


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

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

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

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

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

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

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

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


template<typename superType, class Operators>
struct Field : Ring<superType, Operators> {

   using BaseRing = Ring<superType, Operators>;

   template<typename... Args> Field(Args... args) : BaseRing(args...) {}

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

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

   template<typename... Args> static Field id_add(Args... args) { return BaseRing::id_add(args...); }
   template<typename... Args> static Field id_mul(Args... args) { return BaseRing::id_mul(args...); }

   Field operator+() const { return BaseRing::operator+(); }
   Field operator-() const { return BaseRing::operator-(); }
   Field reciprocal() const { return Operators::Reciprocal(this->x); }

   Field operator+=(const Field& rhs) { return *this = BaseRing::operator+=(rhs); }
   Field operator-=(const Field& rhs) { return *this = BaseRing::operator-=(rhs); }
   Field operator*=(const Field& rhs) { return *this = BaseRing::operator*=(rhs); }
   Field operator/=(const Field& rhs) { return *this *= rhs.reciprocal(); }

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

   Field power(int n) const { return BaseRing::power(n); }

   bool operator<(const Field& rhs) const { return BaseRing::operator<(rhs); }
   bool operator>(const Field& rhs) const { return BaseRing::operator>(rhs); }
   bool operator<=(const Field& rhs) const { return BaseRing::operator<=(rhs); }
   bool operator>=(const Field& rhs) const { return BaseRing::operator>=(rhs); }
   bool operator==(const Field& rhs) const { return BaseRing::operator==(rhs); }
   bool operator!=(const Field& rhs) const { return BaseRing::operator!=(rhs); }

};

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


template<int mod=MOD>
struct ModuloRingOperators {
   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;
   }
};

using MR = Ring<int, ModuloRingOperators<MOD>>;

template<int mod=MOD>
struct GaloisFieldOperators : ModuloRingOperators<mod> {
   static int Reciprocal(int value) { return ModuloRingOperators<mod>::Power(value, mod-2); }
};

using GF = Field<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