// Original C++ solution (slower):
#include<cstdio>

using namespace std;

#define N 16400

#define M 204

#define mod 998244353

int dp[M][N],n,m,fr[N],ifr[N],rev[N],a[N],b[N],ntt[N];

int pw(int a,int p){int as=1;while(p){if(p&1)as=1ll*as*a%mod;a=1ll*a*a%mod;p>>=1;}return as;}

int c(int a,int b){if(a<b)return 0;return 1ll*fr[a]*ifr[b]%mod*ifr[a-b]%mod;}

void dft(int s,int *a,int t)

{

	for(int i=0;i<s;i++)rev[i]=(rev[i>>1]>>1)|(i&1?s>>1:0),ntt[rev[i]]=a[i];

	for(int i=2;i<=s;i<<=1)

	{

		int st=pw(3,(mod-1)/i);

		if(t==-1)st=pw(st,mod-2);

		for(int j=0;j<s;j+=i)

		for(int k=j,t=1;k<j+(i>>1);k++,t=1ll*t*st%mod)

		{

			int v1=ntt[k],v2=1ll*ntt[k+(i>>1)]*t%mod;

			ntt[k]=(v1+v2)%mod;ntt[k+(i>>1)]=(v1-v2+mod)%mod;

		}

	}

	int inv=t==-1?pw(s,mod-2):1;

	for(int i=0;i<s;i++)a[i]=1ll*ntt[i]*inv%mod;

}

int main()

{

	scanf("%d%d",&n,&m);

	dp[0][0]=1;

	fr[0]=ifr[0]=1;for(int i=1;i<=8020;i++)fr[i]=1ll*fr[i-1]*i%mod,ifr[i]=pw(fr[i],mod-2);

	for(int i=1;i<=m;i++)

	{

		int l=1;while(l<=n*2)l<<=1;for(int j=0;j<l;j++)a[j]=b[j]=0;

		for(int j=0;j<=n;j++)a[j]=1ll*dp[i-1][j]*ifr[j]%mod;

		for(int j=1;j<=n;j++)b[j]=ifr[j+2];

		dft(l,a,1);dft(l,b,1);for(int j=0;j<l;j++)a[j]=1ll*a[j]*b[j]%mod;dft(l,a,-1);

		for(int j=0;j<=n;j++)dp[i][j]=(1ll*a[j]*fr[j+2]+1ll*(1ll*j*(j-1)%mod*499122177%mod+j+1)%mod*dp[i-1][j])%mod;

	}

	int as=0;

	for(int j=0;j<=n;j++)as=(as+1ll*dp[m][j]*c(n,j))%mod;

	printf("%d\n",as);

}//

// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;



namespace TYC

{

	typedef long long ll;

	const int N = 8005, M = 205, MAXN = 1 << 15 | 5, mod = 998244353, INV2 = (mod + 1) >> 1;



	int F[M][N], Fac[N], Inv[N], A[MAXN], B[MAXN], w[MAXN], rev[MAXN];



	inline int qpow(int x, int tim)

	{

		int ans = 1;

		for (; tim; tim >>= 1, x = (ll)x * x % mod)

			if (tim & 1)

				ans = (ll)ans * x % mod;

		return ans;

	}



	void init(const int n)

	{

		for (int i = 0; i < n; i++)

			rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (n >> 1));

		w[0] = 1, w[1] = qpow(3, (mod - 1) / n);

		for (int i = 2; i < n; i++)

			w[i] = (ll)w[i - 1] * w[1] % mod;

	}



	void NTT(int *a, const int n, const int type)

	{

		for (int i = 0; i < n; i++)

			if (i < rev[i])

				swap(a[i], a[rev[i]]);

		if (type)

			reverse(w + 1, w + n);

		for (int len = 1; len < n; len <<= 1)

			for (int i = 0; i < n; i += len << 1)

				for (int k = 0; k < len; k++)

				{

					int x = a[i + k], y = (ll)w[n / (len << 1) * k] * a[i + len + k] % mod;

					a[i + k] = (x + y) % mod;

					a[i + len + k] = (x - y + mod) % mod;

				}

		if (type)

		{

			reverse(w + 1, w + n);

			for (int i = 0, t = qpow(n, mod - 2); i < n; i++)

				a[i] = (ll)a[i] * t % mod;

		}

	}



	inline int C(const int x, const int y)

	{ return x < y ? 0 : (ll)Fac[x] * Inv[x - y] % mod * Inv[y] % mod; }



	void work()

	{

		int n, m;

		scanf("%d%d", &n, &m);

		int t = max(n++, m) + 2;

		Fac[0] = 1;

		for (int i = 1; i <= t; i++)

			Fac[i] = (ll)Fac[i - 1] * i % mod;

		Inv[t] = qpow(Fac[t], mod - 2);

		for (int i = t; i; i--)

			Inv[i - 1] = (ll)Inv[i] * i % mod;



		int len;

		for (len = 1; len < (n << 1); len <<= 1);

		init(len);

		F[0][0] = 1;

		for (int j = 1; j <= m; j++)

		{

			for (int i = 0; i < n; i++)

			{

				A[i] = (ll)F[j - 1][i] * Inv[i] % mod;	

				B[i] = Inv[i + 2];

			}

			B[0] = 0;

			memset(A + n, 0, sizeof(int[len - n]));

			memset(B + n, 0, sizeof(int[len - n]));

			NTT(A, len, 0);

			NTT(B, len, 0);

			for (int i = 0; i < len; i++)

				A[i] = (ll)A[i] * B[i] % mod;

			NTT(A, len, 1);

			for (int i = 0; i < n; i++)

				F[j][i] = (((ll)i * (i + 1) / 2 + 1) % mod * F[j - 1][i] % mod + (ll)A[i] * Fac[i + 2] % mod) % mod;

		}

		int ans = 0;

		for (int i = 0; i < n; i++)

			ans = (ans + (ll)F[m][i] * C(n - 1, i)) % mod;

		printf("%d\n", ans);

	}

}



int main()

{

	TYC::work();

	return 0;

}

// Fastest known solution for this problem: