#include <bits/stdc++.h>
using namespace std;

const int maxN = 5005, mod = 1e9 + 7;

int n, m;
int f[maxN + 1][maxN + 1], sum[maxN + 1][maxN + 1];
int pw[maxN + 1], ipw[maxN + 1];

inline int ADD(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }

int main()
{
	scanf("%d %d", &n, &m);

	int I = (mod + 1) / 2;
	pw[0] = ipw[0] = 1;
	for(int i = 1; i <= m; i++)
	{
		pw[i] = 2ll * pw[i - 1] % mod;
		ipw[i] = 1ll * I * ipw[i - 1] % mod;
	}

	for(int j = 1; j <= m; j++) f[1][j] = pw[j];
	for(int j = 1; j < m; j++) sum[1][j] = ADD(sum[1][j - 1], 1ll * f[1][j] * j % mod * ipw[j + 1] % mod);
	for(int i = 2; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			f[i][j] = 1ll * (j + 1) * f[i - 1][j] % mod;
			f[i][j] = ADD(f[i][j], 1ll * sum[i - 1][j - 1] * pw[j] % mod);
		}
		for(int j = 1; j < m; j++) 
			sum[i][j] = ADD(sum[i][j - 1], 1ll * f[i][j] * j % mod * ipw[j + 1] % mod);
	}

	printf("%d\n", f[n][m]);
	return 0;
}
