#include <bits/stdc++.h>
using namespace std;
const int md = 1000000007;
int n, m, i, j, s[5005][5005];
long long f[5005][5005], pw2[5005], o[5005], cur, k;
long long pw(long long a, int b) {
  if (b == 0) return 1LL;
  if (b & 1) return (pw(a, b - 1) * a) % md;
  long long x = pw(a, b / 2);
  return (x * x) % md;
}
int main() {
  scanf("%d%d", &m, &n);
  for (pw2[0] = o[0] = i = 1; i <= n; i++) {
    f[0][i] = 1;
    pw2[i] = (pw2[i - 1] * 2) % md;
    o[i] = pw(pw2[i], md - 2);
  }
  for (i = 1; i <= m; i++) {
    for (j = 1; j <= n; j++) {
      f[i][j] = (f[i - 1][j] * (j + 1LL)) % md;
      cur = 0;
      for (k = 1; k < j; k++) {
        s[i - 1][k] = (((f[i - 1][k] * k) % md) * o[k + 1]) % md;
        cur = (cur + s[i - 1][k]) % md;
      }
      f[i][j] = (f[i][j] + cur * pw2[j]) % md;
      s[i][j] = (((f[i][j] * j) % md) * o[j + 1]) % md;
    }
  }
  printf("%d\n", f[m][n]);
  return 0;
}
