#include <bits/stdc++.h>
using namespace std;
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define getbit(i,j) ((i>>j)&1)
#define sz size()
#define pb emplace_back
#define pf push_front
#define fi first
#define se second
#define ms(a,x) memset(a, x, sizeof (a))
#define re exit(0)
#define __builtin_popcount cc
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pair<int, int> > vpii;
typedef vector<pair<ll, ll> > vpll;
const ll mod=1e9+7, maxn=2e7+5, inf=1e18;
void rf(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen("o.inp","r")){
freopen("o.inp","r",stdin); freopen("o.out","w",stdout);
}
}
ll n, m, f[maxn], f2[maxn];
ll bpow(ll a, ll b, ll m)
{
ll ans=1ll;
while(b>0)
{
if(b&1) ans=ans*a%m;
a=a*a%m;
b>>=1;
}
return ans%m;
}
ll bmul(ll a, ll b, ll m)
{
ll ans=1ll;
if(!b) return 0;
ll x = bmul(a, b/2, m);
if(b&1) return ((x%m)*2+a)%m;
else return ((x%m)*2)%m;
}
void pre()
{
f[0]=1;
ff(i, 1, 20000001) f[i]=f[i-1]*i, f[i]%=mod;
f2[20000001]=bpow(f[20000001], mod-2, mod);
ffr(i, 20000000, 0) f2[i]=f2[i+1]*(i+1), f2[i]%=mod;
}
ll ckn(ll k, ll n)
{
if(k>n) return 0;
ll a=f[n], b=(f2[k]*f2[n-k])%mod;
return (a*b)%mod;
}
int main()
{
rf();
pre();
cin>>n>>m;
ll ans=0;
ff(i, 0ll, min(m, n)) ans+=(ckn(i, n+m-i)*ckn(n-i, n+m-2*i))%mod, ans%=mod;
cout<<ans%mod;
re;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZmYoaSwgYSwgYikgZm9yKGF1dG8gaT0oYSk7IGk8PShiKTsgKytpKQojZGVmaW5lIGZmcihpLCBiLCBhKSBmb3IoYXV0byBpPShiKTsgaT49KGEpOyAtLWkpCiNkZWZpbmUgbmwgIlxuIgojZGVmaW5lIHNzICIgIgojZGVmaW5lIGdldGJpdChpLGopICgoaT4+aikmMSkKI2RlZmluZSBzeiBzaXplKCkKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBwZiBwdXNoX2Zyb250CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBtcyhhLHgpIG1lbXNldChhLCB4LCBzaXplb2YgKGEpKQojZGVmaW5lIHJlIGV4aXQoMCkKI2RlZmluZSBfX2J1aWx0aW5fcG9wY291bnQgY2MKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgdmVjdG9yPHBhaXI8aW50LCBpbnQ+ID4gdnBpaTsKdHlwZWRlZiB2ZWN0b3I8cGFpcjxsbCwgbGw+ID4gdnBsbDsKCmNvbnN0IGxsIG1vZD0xZTkrNywgbWF4bj0yZTcrNSwgaW5mPTFlMTg7Cgp2b2lkIHJmKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgaWYoZm9wZW4oIm8uaW5wIiwiciIpKXsKICAgICAgICBmcmVvcGVuKCJvLmlucCIsInIiLHN0ZGluKTsgZnJlb3Blbigiby5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQp9CgpsbCBuLCBtLCBmW21heG5dLCBmMlttYXhuXTsKCmxsIGJwb3cobGwgYSwgbGwgYiwgbGwgbSkKewogICAgbGwgYW5zPTFsbDsKICAgIHdoaWxlKGI+MCkKICAgIHsKICAgICAgICBpZihiJjEpIGFucz1hbnMqYSVtOwogICAgICAgIGE9YSphJW07CiAgICAgICAgYj4+PTE7CiAgICB9CiAgICByZXR1cm4gYW5zJW07Cn0KCmxsIGJtdWwobGwgYSwgbGwgYiwgbGwgbSkKewogICAgbGwgYW5zPTFsbDsKICAgIGlmKCFiKSByZXR1cm4gMDsKICAgIGxsIHggPSBibXVsKGEsIGIvMiwgbSk7CiAgICBpZihiJjEpIHJldHVybiAoKHglbSkqMithKSVtOwogICAgZWxzZSByZXR1cm4gKCh4JW0pKjIpJW07Cn0KCnZvaWQgcHJlKCkKewogICAgZlswXT0xOwogICAgZmYoaSwgMSwgMjAwMDAwMDEpIGZbaV09ZltpLTFdKmksIGZbaV0lPW1vZDsKICAgIGYyWzIwMDAwMDAxXT1icG93KGZbMjAwMDAwMDFdLCBtb2QtMiwgbW9kKTsKICAgIGZmcihpLCAyMDAwMDAwMCwgMCkgZjJbaV09ZjJbaSsxXSooaSsxKSwgZjJbaV0lPW1vZDsKfQoKbGwgY2tuKGxsIGssIGxsIG4pCnsKICAgIGlmKGs+bikgcmV0dXJuIDA7CiAgICBsbCBhPWZbbl0sIGI9KGYyW2tdKmYyW24ta10pJW1vZDsKICAgIHJldHVybiAoYSpiKSVtb2Q7Cn0KCmludCBtYWluKCkKewogICAgcmYoKTsKICAgIHByZSgpOwogICAgY2luPj5uPj5tOwogICAgbGwgYW5zPTA7CiAgICBmZihpLCAwbGwsIG1pbihtLCBuKSkgYW5zKz0oY2tuKGksIG4rbS1pKSpja24obi1pLCBuK20tMippKSklbW9kLCBhbnMlPW1vZDsKICAgIGNvdXQ8PGFucyVtb2Q7CiAgICByZTsKfQo=