#include<bits/stdc++.h>
#define ll long long
using namespace std;
const static ll mod=1000000007;
int n,m;
ll dp[51];
int main() {
cin.tie(0)->ios::sync_with_stdio(false);
cin>>n>>m;
dp[0]=1;
//先枚举列,因为j层是依赖于j-1层去产生的
for(int j=1;j<=m;j++){
//为什么需要从底至顶更新?
//那是因为多的节点数量依赖于少的节点数量生成,如果相反的话就会覆盖掉原来的值
for(int i=n;i>=1;i--){
dp[i]=0;//一定记得要更新当前的节点信息
//对于这道题是不依赖于原本的位置的信息的,不然你甚至还需要用一个变量去存取当前待更新节点的原信息
for(int k=0;k<i;k++){
dp[i]=(dp[i]+(dp[k]*dp[i-1-k])%mod)%mod;
}
}
}
cout<<dp[n]<<endl;
return EXIT_SUCCESS;
}