#include <bits/stdc++.h>
using namespace std;
long long int M = 1000000007;
typedef struct {
  long long int m[2][2];
} arr;
arr mmul(arr a, arr b) {
  arr temp;
  temp.m[0][0] = ((((a.m[0][0] * b.m[0][0] + M) % M) +
                   ((a.m[0][1] * b.m[1][0] + M) % M) + M) %
                  M);
  temp.m[0][1] = ((((a.m[0][0] * b.m[0][1] + M) % M) +
                   ((a.m[0][1] * b.m[1][1] + M) % M) + M) %
                  M);
  temp.m[1][0] = ((((a.m[1][0] * b.m[0][0] + M) % M) +
                   ((a.m[1][1] * b.m[1][0] + M) % M) + M) %
                  M);
  temp.m[1][1] = ((((a.m[1][0] * b.m[0][1] + M) % M) +
                   ((a.m[1][1] * b.m[1][1] + M) % M) + M) %
                  M);
  return temp;
}
arr mpow(arr a, long long int n) {
  if (n == 1) return a;
  arr half = mpow(a, n / 2);
  if (n % 2 == 0)
    return mmul(half, half);
  else
    return mmul(mmul(half, half), a);
}
int main() {
  long long int n;
  cin >> n;
  if (n == 0) {
    cout << 1 << endl;
    return 0;
  }
  if (n == 1) {
    cout << 3 << endl;
    return 0;
  }
  n--;
  arr a;
  a.m[0][0] = 6;
  a.m[0][1] = -8;
  a.m[1][0] = 1;
  a.m[1][1] = 0;
  arr x;
  x = mpow(a, n);
  cout << ((x.m[0][0] * 3 + x.m[0][1] * 1) + M) % M;
  return 0;
}
