#include <bits/stdc++.h>

using namespace std;

template <typename A, typename B>
string to_string(pair<A, B> p);

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);

string to_string(const string& s) {
  return '"' + s + '"';
}

string to_string(const char* s) {
  return to_string((string) s);
}

string to_string(bool b) {
  return (b ? "true" : "false");
}

string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}

template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}

template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}

template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}

template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}

template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}

void debug_out() { cerr << endl; }

template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}

#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif
const int MOD = 1e9 + 7;
string a = "ACGT";
int dp[110][64];
int get(string s) {
  int cur = 0;
  for (auto c : s) {
    cur *= 4;
    for (int i = 0; i < 4; i++) {
      if (c == a[i]) {
        cur += i;
      }
    }

  }
  return cur;
}
string get(int x) {
  string res;
  res += a[x / 16 % 4];
  res += a[x / 4 % 4];
  res += a[x / 1 % 4];
  return res;
}
int add(int x, int y) {
  x += y;
  if (x >= MOD) {
    x -= MOD;
  }
  return x;
}

bool agc(string s) {
  for (int i = 0; i <= 1; i++) {
    if (s[i] == 'A' && s[i + 1] == 'G' && s[i + 2] == 'C') {
      return true;
    }
  }
  return false;
}

bool check(string s) {
  if (agc(s)) {
    return false;
  }
  for (int i = 0; i <= 2; i++) {
    string cur = s;
    swap(cur[i], cur[i + 1]);
    if (agc(cur)) {
      return false;
    }
  }
  return true;
}
int main() {
  ios:: sync_with_stdio(false);
  cin.tie();
  int n;
  cin >> n;
//  for (int i = 0; i < 64; i++) {
//    debug(get(i));
//    debug(get(get(i)));
//  }
  for (int i = 0; i < 64; i++) {
      dp[3][i] = 1;
  }
  dp[3][get("AGC")] = 0;
  dp[3][get("ACG")] = 0;
  dp[3][get("GAC")] = 0;
  for (int i = 4; i <= n; i++) {
    for (int j = 0; j < 64; j++) {
      for (int k = 0; k < 4; k++) {
        string cur = get(j);
        cur += a[k];
        string w;
        w += cur[1];
        w += cur[2];
        w += cur[3];
        if (check(cur)) {
          dp[i][get(w)] = add(dp[i][get(w)], dp[i - 1][j]);
        } else {
          //debug(cur);
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < 64; i++) {
    ans = add(ans, dp[n][i]);
  }
  cout << ans;
  return 0;
}




Measured memory_bytes: 3648