#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
struct node {
  long long data[2][2];
  void zero() {
    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 2; j++) data[i][j] = 0;
    }
  }
  void one() {
    zero();
    for (int i = 0; i < 2; i++) data[i][i] = 1;
  }
};
node mul_(node a, node b) {
  node ans;
  ans.zero();
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
      for (int k = 0; k < 2; k++)
        ans.data[i][j] = (ans.data[i][j] + a.data[i][k] * b.data[k][j]) % mod;
    }
  }
  return ans;
}
node qpow(node a, int b) {
  node ans;
  ans.one();
  while (b) {
    if (b & 1) ans = mul_(ans, a);
    a = mul_(a, a);
    b >>= 1;
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, m;
  cin >> n >> m;
  node a, b;
  a.zero(), b.zero();
  a.data[0][0] = 4;
  a.data[1][0] = 2;
  b.data[0][0] = b.data[0][1] = b.data[1][0] = 1;
  a = mul_(qpow(b, m - 1), a);
  long long ans = a.data[1][0] + 2 * (n - 1);
  cout << ans % mod << '\n';
  return 0;
}
