#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#define rep(i, a, b) for (int i = (a), _ = (b); i <= _; ++ i)
#define per(i, a, b) for (int i = (a), _ = (b); i >= _; -- i)
#define For(i, a, b) for (int i = (a), _ = (b); i < _; ++ i)
#define ri rd<int>
using namespace std;
const int maxN = 3e3 + 7;
const int mod = 1e9 + 7;
inline int pls(int x, int y) {return (x + y) % mod;}
inline int mul(int x, int y) {return 1LL * x * y % mod;}
inline int mns(int x, int y) {return pls(x, mod - y);}
inline void Add(int &x, int y) {x = pls(x, y);}
inline void Mul(int &x, int y) {x = mul(x, y);}
template<class T> inline T rd() {
bool f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = 0;
T x = 0; for (; isdigit(c); c = getchar()) x = x * 10 + c - 48; return f ? x : -x;
}
int n, m;
int f[maxN][maxN][2];
inline int sp(int x) {return x == 1 || x == n;}
int main() {
n = ri() + 1, m = ri();
rep (i, 1, n) f[0][i][(i == 1)] = 1;
rep (i, 1, m) rep (j, 1, n) rep (k, 0, 1) {
rep (d, -1, 1) {
int y = j + d;
if (y < 1 || y > n) continue;
if (d != 0) {
Add(f[i][y][k | (y == 1)], f[i-1][j][k]);
}
else {
Add(f[i][y][k | (j == 2)], f[i-1][j][k]);
if (!sp(j)) Add(f[i][y][k], f[i-1][j][k]);
}
}
}
int res = 0;
rep (i, 1, n) Add(res, f[m][i][1]);
printf("%d\n", res);
return 0;
}