#include <bits/stdc++.h>
using namespace std;
long long gcd(long long x, long long y) { return (y ? gcd(y, x % y) : x); }
long long lcm(long long x, long long y) { return x * (y / gcd(x, y)); }
int oo = 1e9 + 7;
int n, m;
long long dpv[100000][3][3];
long long dph[100000][3][3];
long long gon(int i, int j, int mov) {
  if (i == n - 1) return 1;
  if (dpv[i][j][mov] != -1) return dpv[i][j][mov];
  long long& ans = dpv[i][j][mov];
  ans = 0;
  if (mov == 1) {
    ans = (ans + gon(i + 1, j, 0)) % oo;
    if (j == 1) ans = (ans + gon(i + 1, j - 1, 1)) % oo;
    if (j == 0) ans = (ans + gon(i + 1, j + 1, 1)) % oo;
  } else {
    if (j == 1) ans = (ans + gon(i + 1, j - 1, 1)) % oo;
    if (j == 0) ans = (ans + gon(i + 1, j + 1, 1)) % oo;
  }
  return ans;
}
long long gom(int i, int j, int mov) {
  if (i == m - 1) return 1;
  if (dph[i][j][mov] != -1) return dph[i][j][mov];
  long long& ans = dph[i][j][mov];
  ans = 0;
  if (mov == 1) {
    ans = (ans + gom(i + 1, j, 0)) % oo;
    if (j == 1) ans = (ans + gom(i + 1, j - 1, 1)) % oo;
    if (j == 0) ans = (ans + gom(i + 1, j + 1, 1)) % oo;
  } else {
    if (j == 1) ans = (ans + gom(i + 1, j - 1, 1)) % oo;
    if (j == 0) ans = (ans + gom(i + 1, j + 1, 1)) % oo;
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  memset(dpv, -1, sizeof dpv);
  memset(dph, -1, sizeof dph);
  cin >> n >> m;
  cout << ((gon(0, 0, 1) * 2ll) % oo + (gom(0, 0, 1) * 2ll) % oo - 2) % oo
       << endl;
  return 0;
}
