#include <bits/stdc++.h>
using namespace std;
int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
pair<pair<int, int>, pair<int, int> > intersect(pair<int, int> f1,
                                                pair<int, int> f2,
                                                pair<int, int> s1,
                                                pair<int, int> s2) {
  int x5, y5, x6, y6;
  x5 = max(min(f1.first, f2.first), min(s1.first, s2.first));
  x6 = min(max(f1.first, f2.first), max(s1.first, s2.first));
  y5 = max(min(f1.second, f2.second), min(s1.second, s2.second));
  y6 = min(max(f1.second, f2.second), max(s1.second, s2.second));
  if (x5 >= x6 || y5 >= y6) {
    return {{0, 0}, {0, 0}};
  }
  return {{x5, y5}, {x6, y6}};
}
bool isPrime(long long n) {
  if (n < 2) return 0;
  for (long long i = 2; i * i <= n; i++) {
    if (n % i == 0) return 0;
  }
  return 1;
}
void faster() {
  if (0) {
    freopen(
        "taskA"
        ".in",
        "r", stdin);
    freopen(
        "taskA"
        ".out",
        "w", stdout);
  }
  if (1) {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
  }
}
const long long INF = 1e18;
const int inf = 1e9;
const int MAXN = (int)2e5 + 123;
const int MOD = (int)1e9 + 7;
const long double PI = acos(-1);
const long double EPS = 3E-16;
namespace MATH_CAL {
const int mod = MOD;
inline long long add(long long a, long long b) {
  return a + b >= mod ? a + b - mod : a + b;
}
inline long long sub(long long a, long long b) {
  return a - b < 0 ? a - b + mod : a - b;
}
inline long long mul(long long a, long long b) {
  return (long long)a * b % mod;
}
inline void Add(long long &a, long long b) { (a += b) >= mod ? a -= mod : 0; }
inline void Sub(long long &a, long long b) { (a -= b) < 0 ? a += mod : 0; }
inline long long qpow(long long first, long long n) {
  long long r = 1;
  for (; n; n /= 2, first = mul(first, first))
    if (n & 1) r = mul(r, first);
  return r;
}
inline long long mod_inv(long long first) { return qpow(first, mod - 2); }
inline long long gcd(long long a, long long b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
}  // namespace MATH_CAL
using namespace MATH_CAL;
void solve() {
  int n, m;
  cin >> n >> m;
  int fact = 1;
  for (int i = 1; i <= 2 * m; i++) {
    fact = mul(fact, i);
  }
  int sec = 1;
  for (int i = 1; i <= n - 1; i++) {
    sec = mul(sec, i);
  }
  int up = 1;
  for (int i = 1; i <= 2 * m + n - 1; i++) {
    up = mul(up, i);
  }
  int down = mul(mod_inv(fact), mod_inv(sec));
  cout << mul(up, down) << endl;
}
int main() {
  faster();
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
