#include<bits/stdc++.h>
const int N=1000000;
using namespace std;
bool mp[2][N];
int cnt=0;
int n;
void dfs(int row,int col){
cnt=cnt%1000000007;
if(col==n && row==2){
cnt++;
return ;
}
if(row>=2){ //下一列
dfs(0,col+1);
return;
}
if(mp[row][col]==1){ //下一行
dfs(row+1,col);
return ;
}
//I型木块两种情况,平放和竖放
//1.竖放
if(row==0 && mp[row][col]==0 && mp[row+1][col]==0){
mp[row][col]=1,mp[row+1][col]=1;
dfs(row+2,col); //直接下一列
mp[row][col]=0,mp[row+1][col]=0;
}
//2.横放
if(col+1<=n &&mp[row][col]==0 && mp[row][col+1]==0){
mp[row][col]=1 , mp[row][col+1]=1;
dfs(row+1,col);
mp[row][col]=0 , mp[row][col+1]=0;
}
//L型木块有四种可能
//第一种
if(row==0 && col+1<=n && mp[row][col]==0 && mp[row+1][col]==0 && mp[row+1][col+1]==0){
mp[row][col]=1 , mp[row+1][col]=1 , mp[row+1][col+1]=1;
dfs(row,col+1);
mp[row][col]=0 , mp[row+1][col]=0 , mp[row+1][col+1]=0;
}
//第二种
if(row==1 && col+1<=n && mp[row][col]==0 && mp[row][col+1]==0 && mp[row-1][col+1]==0) {
mp[row][col]=1 , mp[row][col+1]=1 , mp[row-1][col+1]=1;
dfs(row+1,col); //直接下一列
mp[row][col]=0 , mp[row][col+1]=0 , mp[row-1][col+1]=0;
}
//第三种
if(row==0 && col+1<=n && mp[row][col]==0 && mp[row+1][col]==0 && mp[row][col+1]==0){
mp[row][col]=1 , mp[row+1][col]=1 , mp[row][col+1]=1;
dfs(row+1,col+1);
mp[row][col]=0 , mp[row+1][col]=0 , mp[row][col+1]=0;
}
//第四种
if(row==0 && col+1<=n && mp[row][col]==0 && mp[row][col+1]==0 && mp[row+1][col+1]==0){
mp[row][col]=1 , mp[row][col+1]=1 , mp[row+1][col+1]=1;
dfs(row+1,col);
mp[row][col]=0 , mp[row][col+1]=0 , mp[row+1][col+1]=0;
}
}
int main(){
cin>>n;
//搜索方式从上到下从左到右
dfs(0,1);
cout<<cnt%1000000007<<endl;
return 0;
}