#include<bits/stdc++.h>

#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)a, i##_len=(b); i<i##_len; i++)
#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)

#define int long long

using namespace std;

using P = pair<int, int>;
using ll = long long;

const long long INF = LLONG_MAX/3;
 
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) + ")";
}
 
void debug_out() { cerr << endl; }
 
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
 
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

class UnionFind{
	std::vector<int> par,siz;
	void init(int n){
		par.resize(n);
		for(int i=0;i<n;i++)par[i]=i;
		siz.resize(n,1);
	}
public:
	UnionFind(int n){
		init(n);
	}
	int root(int n){
		if(par[n]==n)return n;
		else return par[n]=root(par[n]);
	}
	bool issame(int x,int y){
		return (root(x)==root(y));
	}
	bool marge(int a,int b){
		if(issame(a,b))return false;
		else{
			a=root(a),b=root(b);
			if(siz[a]<siz[b])swap(a,b);
			siz[a]+=siz[b];
			par[a]=par[b];
			return true;
		}
	}
	int size(int n){
		return siz[root(n)];
	}
};

long long gcd(long long a,long long b){
    if(b==0)return a;
    return gcd(b,a%b);
}
long long lcm(long long i,long long j){
    return i*(j/gcd(i,j));
}
bool isOK(int a,int b,int c,int d){
	if(a==1&&b==3&&c==2)return false;
	if(b==1&&c==3&&d==2)return false;
	swap(a,b);
	if(a==1&&b==3&&c==2)return false;
	if(b==1&&c==3&&d==2)return false;
	swap(a,b);
	swap(b,c);
	if(a==1&&b==3&&c==2)return false;
	if(b==1&&c==3&&d==2)return false;
	swap(b,c);
	swap(c,d);
	if(a==1&&b==3&&c==2)return false;
	if(b==1&&c==3&&d==2)return false;
	swap(c,d);
	return true;
}
signed main(){
	const int MOD=1e9+7;
	int n;
	cin>>n;
	int dp[200][5][5][5][5]={};
	dp[0][0][0][0][0]=1;
	rep(i,1,n+1){
		rep(j,5){
			rep(k,5){
				rep(l,5){
					rep(m,5){
						rep(r,1,5){
							dp[i][k][l][m][r]+=dp[i-1][j][k][l][m];
							dp[i][k][l][m][r]%=MOD;
							if(!isOK(k,l,m,r))dp[i][k][l][m][r]=0;
						}
					}
				}
			}
		}
	}
	int ans=0;
	rep(i,5){
		rep(j,5){
			rep(k,5){
				rep(l,5){
					ans+=dp[n][i][j][k][l];
					ans%=MOD;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

Measured memory_bytes: 1280