#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
constexpr int MOD = 1e9+7;
int main() {
int W, H; cin >> W >> H;
if (W <= H) {
// O(w^2 * h)
vector<int> All(W+1, 0), Disconnected(W+1, 0), Connected(W+1, 0);
All[0] = All[1] = Connected[0] = Connected[1] = 1;
for (int i = 2; i <= W; ++i) All[i] = (All[i-1] + All[i-2]) % MOD;
for (int i = 2; i <= W; ++i) {
ll pw = 1;
for (int j = 0; j < H; ++j) ( pw *= All[i] ) %= MOD;
All[i] = pw;
for (int j = 1; j < i; ++j) ( Disconnected[i] += 1LL * Connected[j] * All[i-j] % MOD ) %= MOD;
Connected[i] = ( All[i] - Disconnected[i] + MOD ) % MOD;
}
cout << Connected[W] << '\n';
} else {
// O (w * h^2)
vector<vector<int>> C(H+1, vector<int>(H+1, 0));
for (int i = 0; i <= H; i++) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j) C[i][j] = (C[i-1][j-1] + C[i-1][j]) % MOD;
}
vector<ll> D(H+1, 0), E(H+1, 0);
for (int i = 1; i <= H; i++) D[i] = C[H][i];
for (int a = 0; a < W-2; a++) {
E.assign(H+1, 0);
for (int i = 1; i < H; i++) {
for (int j = 1; i+j <= H; j++) {
E[j] += D[i] * ll(C[H-i][j]) % MOD;
}
}
for (int i = 0; i <= H; i++) E[i] %= MOD;
swap(E, D);
}
ll ans = 0;
for (int i = 0; i <= H; i++) ans += D[i];
cout << (ans % MOD) << '\n';
}
}