//Awwawa! Dis cold yis ratten buy tEMMIE!
#include <bits/stdc++.h>
#define ll long long
#define maxn 5005 /*rem*/
#define mod 1000000007
#define db double
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define pi pair<int, int>
#define fi first
#define se second

template <typename T> bool chkmax(T &x,T y){return x<y?x=y,true:false;}
template <typename T> bool chkmin(T &x,T y){return x>y?x=y,true:false;}

using namespace std;
ll ksm(ll a, ll b) {
   if (!b) return 1;
   ll ns = ksm(a, b >> 1);
   ns = ns * ns % mod;
   if (b & 1) ns = ns * a % mod;
   return ns;
}
ll pw[maxn];
ll dp[maxn][maxn]; 
int main() {
	pw[0] = 1;
	for (int i = 1; i < maxn; i++)
		pw[i] = pw[i - 1] * 2 % mod;
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		ll pl = 0;
		for (int j = 1; j <= m; j++) {
			if (i == 1) dp[i][j] = pw[j];
			else {
				dp[i][j] = (j + 1) * dp[i - 1][j] % mod;
				pl *= 2;
				pl += dp[i - 1][j - 1] * (j - 1);
				pl %= mod;
				dp[i][j] = (dp[i][j] + pl) % mod;
			//	}
				/*
					dp[i][j] += dp[i - 1][j - d] * pw[d - 1] % mod * (j - d), 
					dp[i][j] %= mod;
				*/
			}
		}
	}
	cout << dp[n][m] << endl;
	return 0;
}
