#include <bits/stdc++.h>
using LL = long long;
using namespace std;

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 Type, typename Operators>
struct AlgStruct {

    Type x;

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

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


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

    template<typename... Args>
        static AlgStruct idAdd(Args... args) { return Operators::IdAdd(args...); }

    template<typename... Args>
        static AlgStruct idMul(Args... args) { return Operators::IdMul(args...); }

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

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

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

    const AlgStruct power(LL n) const { return Operators::Power(x, n); }

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

template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator+(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) + rhs;
}
template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator-(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) - rhs;
}
template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator*(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) * rhs;
}
template<typename Type, typename Operators>
const AlgStruct<Type, Operators> operator/(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) / rhs;
}

template<typename Type, typename Operators>
bool operator<(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) < rhs;
}
template<typename Type, typename Operators>
bool operator>(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) > rhs;
}
template<typename Type, typename Operators>
bool operator<=(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) <= rhs;
}
template<typename Type, typename Operators>
bool operator>=(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) >= rhs;
}
template<typename Type, typename Operators>
bool operator==(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) == rhs;
}
template<typename Type, typename Operators>
bool operator!=(const Type& lhs, const AlgStruct<Type, Operators>& rhs) {
    return AlgStruct<Type, Operators>(lhs) != rhs;
}

template<typename Type, typename Operators>
auto& operator<<(ostream& s,const AlgStruct<Type, Operators>& value){ s << value.x; return s; }


template<LL mod>
struct GaloisFieldOperators {
    static LL Add(LL lhs, LL rhs) { return (lhs + rhs) % mod; };
    static LL Mul(LL lhs, LL rhs) { return (lhs * rhs) % mod; };
    static LL IdAdd() { return 0; };
    static LL IdMul() { return 1; };
    static LL Opposite(LL value) { return ((-value % mod) + mod) % mod; };
    static bool Less(LL lhs, LL rhs) { return lhs < rhs; };
    static LL Power(LL value, LL n) {
        LL res = IdMul();
        while (n > 0) {
            if (n & 1) res = Mul(res, value);
            value = Mul(value, value); n >>= 1;
        }
        return res;
    }
    static LL Reciprocal(LL value) { return Power(value, mod-2); }
};

const LL MOD = 1e9+7;
using GaloisField = AlgStruct<LL, GaloisFieldOperators<MOD>>;


signed main()
{
    LL n; cin >> n;

    auto dp = make_v<GaloisField>(n+1, 4, 4, 4);
    vector<char> 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];
                        }
                    }
                }
            }
        }
    }
    GaloisField 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