#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5005;
const int P = 1e9 + 7;
template <typename T>
void chkmax(T &x, T y) {
  x = max(x, y);
}
template <typename T>
void chkmin(T &x, T y) {
  x = min(x, y);
}
template <typename T>
void read(T &x) {
  x = 0;
  int f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  x *= f;
}
void update(int &x, int y) {
  x += y;
  if (x >= P) x -= P;
}
int power(int x, int y) {
  if (y == 0) return 1;
  int tmp = power(x, y / 2);
  if (y % 2 == 0)
    return 1ll * tmp * tmp % P;
  else
    return 1ll * tmp * tmp % P * x % P;
}
int dp[MAXN][MAXN];
int main() {
  int n, m;
  read(n), read(m);
  for (int i = 1; i <= m; i++) dp[0][i] = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      update(dp[i][j], 1ll * dp[i - 1][j] * (j + 1) % P);
      for (int k = 2; k <= j; k++)
        update(dp[i][j], 1ll * dp[i - 1][j - k + 1] * (j - k + 1) % P *
                             power(2, k - 2) % P);
    }
  cout << dp[n][m] << endl;
  return 0;
}
