#include<iostream>
#include<cstring>
using namespace std;

const int maxn=2,mod=1000000007;

struct Matrix
{
    long long  mat[maxn][maxn];
    Matrix operator*(const Matrix& m)const///重载*运算符,使其能进行矩阵相乘的运算
    {
        Matrix tmp;
        for(int i = 0 ; i < maxn ; i++)
        {
            for(int j = 0 ; j < maxn ; j++)
            {
                tmp.mat[i][j] = 0;
                for(int k = 0 ; k < maxn ; k++)
                {
                    tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%mod;
                    tmp.mat[i][j] %= mod;

                }
            }
        }
        return tmp;
    }
};

Matrix m;

void init()
{
    m.mat[0][0]=3;
    m.mat[0][1]=1;
    m.mat[1][0]=1;
    m.mat[1][1]=3;
}

long long run(long long n)
{
    Matrix ans;
    memset(ans.mat,0,sizeof(ans.mat));
    for(int i=0; i<2; i++)
        ans.mat[i][i]=1;
    while(n)
    {
        if(n&1)
            ans=ans*m;
        n>>=1;
        m=m*m;
    }
    return ans.mat[0][0];
}

int main()
{
    long long n;
    while(cin>>n)
    {
        init();
        cout<<run(n)<<endl;
    }
    return 0;
}