#include <iostream>
typedef long long ll;
const ll mod = ll(1e9)+7;
struct Vector {
ll a, b;
};
struct Matrix {
ll a, b, c, d;
Matrix mul(const Matrix& m) const {
return Matrix{
(a * m.a + b * m.c) % mod, (a * m.b + b * m.d) % mod,
(c * m.a + d * m.c) % mod, (c * m.b + d * m.d) % mod
};
}
Vector mul(const Vector& v) const {
return Vector{
(a * v.a + b * v.b) % mod,
(c * v.a + d * v.b) % mod
};
}
};
Matrix pow(Matrix a, ll n) {
Matrix res{1,0,0,1};
while (n > 0) {
if (n % 2 == 1) {
res = res.mul(a);
}
a = a.mul(a);
n /= 2;
}
return res;
}
int main() {
Matrix A{3,1,1,3};
Vector x{1,0};
ll n;
std::cin >> n;
x = pow(A, n).mul(x);
std::cout << x.a;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdHlwZWRlZiBsb25nIGxvbmcgbGw7Cgpjb25zdCBsbCBtb2QgPSBsbCgxZTkpKzc7CgpzdHJ1Y3QgVmVjdG9yIHsKICAgIGxsIGEsIGI7Cn07CgpzdHJ1Y3QgTWF0cml4IHsKICAgIGxsIGEsIGIsIGMsIGQ7CiAgICAKICAgIE1hdHJpeCBtdWwoY29uc3QgTWF0cml4JiBtKSBjb25zdCB7CiAgICAgICAgcmV0dXJuIE1hdHJpeHsKICAgICAgICAgICAgKGEgKiBtLmEgKyBiICogbS5jKSAlIG1vZCwgKGEgKiBtLmIgKyBiICogbS5kKSAlIG1vZCwKICAgICAgICAgICAgKGMgKiBtLmEgKyBkICogbS5jKSAlIG1vZCwgKGMgKiBtLmIgKyBkICogbS5kKSAlIG1vZAogICAgICAgIH07CiAgICB9CiAgICAKICAgIFZlY3RvciBtdWwoY29uc3QgVmVjdG9yJiB2KSBjb25zdCB7CiAgICAgICAgcmV0dXJuIFZlY3RvcnsKICAgICAgICAgICAgKGEgKiB2LmEgKyBiICogdi5iKSAlIG1vZCwgCiAgICAgICAgICAgIChjICogdi5hICsgZCAqIHYuYikgJSBtb2QKICAgICAgICB9OwogICAgfQp9OwoKTWF0cml4IHBvdyhNYXRyaXggYSwgbGwgbikgewogICAgTWF0cml4IHJlc3sxLDAsMCwxfTsKICAgIHdoaWxlIChuID4gMCkgewogICAgICAgIGlmIChuICUgMiA9PSAxKSB7CiAgICAgICAgICAgIHJlcyA9IHJlcy5tdWwoYSk7CiAgICAgICAgfQogICAgICAgIGEgPSBhLm11bChhKTsKICAgICAgICBuIC89IDI7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpIHsKICAgIE1hdHJpeCBBezMsMSwxLDN9OwogICAgVmVjdG9yIHh7MSwwfTsKICAgIGxsIG47CiAgICBzdGQ6OmNpbiA+PiBuOwogICAgeCA9IHBvdyhBLCBuKS5tdWwoeCk7CiAgICBzdGQ6OmNvdXQgPDwgeC5hOwogICAgcmV0dXJuIDA7Cn0=