/*
求逆元最好不要递归一起求,而是存在答案里最后一步求不然会超时
就是这里经常卡时间
*/
const int p=1e9+7;
ll qmi(ll a, ll k)
{
ll res = 1;
while (k)
{
if (k & 1) res =res * a % p;
a =a * a % p;
k >>= 1;
}
return res;
}
ll C(ll a,ll b)
{
if (b > a) return 0;
ll ans1 =1,ans2=1 ;
for (int i = 1, j = a; i <= b; i ++, j -- )
{
ans1= ans1 * j % p;
ans2 =ans2 * i % p;
}
return ans1*qmi(ans2,p-2)%p;
}
ll lucas(ll a, ll b)
{
if (a < p && b < p) return C(a, b);
return C(a % p, b % p) * lucas(a / p, b / p) % p;
}
ll n,m;
int main()
{
cin >> n >> m;
ll ans=lucas(n+m-1,m);
cout << ans << '\n';
return 0;
}