To AmShZ, all arrays are equal, but some arrays are more-equal than others. Specifically, the arrays consisting of n elements from 1 to n that can be turned into permutations of numbers from 1 to n by adding a non-negative integer to each element.

Mashtali who wants to appear in every problem statement thinks that an array b consisting of k elements is compatible with a more-equal array a consisting of n elements if for each 1 ≤ i ≤ k we have 1 ≤ b_i ≤ n and also a_{b_1} = a_{b_2} = … = a_{b_k}.

Find the number of pairs of arrays a and b such that a is a more-equal array consisting of n elements and b is an array compatible with a consisting of k elements modulo 998244353.

Note that the elements of b are not necessarily distinct, same holds for a.

Input

The first line of input contains two integers n and k (1 ≤ n ≤ 10^9 , 1 ≤ k ≤ 10^5).

Output

Print a single integer — the answer to the problem modulo 998244353.

Examples

Input


1 1


Output


1


Input


2 2


Output


8


Input


5 4


Output


50400


Input


20 100


Output


807645526


Input


10000000 10000


Output


883232350

Note

There are eight possible pairs for the second example: 

  1. a = \{1, 1\}, b = \{1, 1\} 
  2. a = \{1, 1\}, b = \{1, 2\} 
  3. a = \{1, 1\}, b = \{2, 1\} 
  4. a = \{1, 1\}, b = \{2, 2\} 
  5. a = \{1, 2\}, b = \{1, 1\} 
  6. a = \{1, 2\}, b = \{2, 2\} 
  7. a = \{2, 1\}, b = \{1, 1\} 
  8. a = \{2, 1\}, b = \{2, 2\} 
#include<bits/stdc++.h>
typedef int LL;
typedef double dl;
#define opt operator
#define pb push_back
#define pii std::pair<LL,LL>
const LL maxn=5e5+9,mod=998244353,inf=0x3f3f3f3f,G=3;
LL Read(){
	LL x(0),f(1); char c=getchar();
	while(c<'0' || c>'9'){
		if(c=='-') f=-1; c=getchar();
	}
	while(c>='0' && c<='9'){
		x=(x<<3ll)+(x<<1ll)+c-'0'; c=getchar();
	}return x*f;
}
void Chkmin(LL &x,LL y){
	if(y<x) x=y;
}
void Chkmax(LL &x,LL y){
	if(y>x) x=y;
}
LL add(LL x,LL y){
	return x+=y,x>=mod?x-mod:x;
}
LL dec(LL x,LL y){
	return x-=y,x<0?x+mod:x;
}
LL mul(LL x,LL y){
	return 1ll*x*y%mod;
}
LL Pow(LL base,LL b){
	LL ret(1); while(b){
		if(b&1) ret=mul(ret,base); base=mul(base,base); b>>=1;
	}return ret;
}
LL inv[maxn];
namespace Poly{
	LL r[maxn],wn[2][maxn];
	void Init(){
		for(LL i=0,mid=1;i<18;++i,mid<<=1){
			LL w1(Pow(G,(mod-1)/(mid<<1)));
			LL w2(Pow(w1,mod-2));
			for(LL j=0,w=1;j<mid;++j,w=mul(w,w1)){
				wn[0][mid+j]=w;
			}
			for(LL j=0,w=1;j<mid;++j,w=mul(w,w2)){
				wn[1][mid+j]=w;
			}
		}
	}
	LL Fir(LL N){
		LL limit(1),len(0);
		while(limit<=N) limit<<=1,++len;
		for(LL i=0;i<limit;++i) r[i]=(r[i>>1]>>1)|((i&1)<<len-1);
		return limit;
	}
	void Ntt(LL *A,LL N,LL op){
		for(LL i=0;i<N;++i) if(i<r[i]) std::swap(A[i],A[r[i]]);
		for(LL mid=1;mid<N;mid<<=1){
			for(LL j=0;j<N;j+=(mid<<1)){
				for(LL k=0;k<mid;++k){
					LL x(A[j+k]),y(mul(wn[op==-1][mid+k],A[j+k+mid]));
					A[j+k]=add(x,y);
					A[j+k+mid]=dec(x,y);
				}
			}
		}
		if(op==-1){
			LL tmp(Pow(N,mod-2));
			for(LL i=0;i<N;++i) A[i]=mul(A[i],tmp);
		}
	}
	void Mul(LL *A,LL N,LL *B,LL M,LL *C,LL len){
		LL limit(Fir(N+M-2));
		static LL tA[maxn],tB[maxn];
		for(LL i=0;i<N;++i) tA[i]=A[i]; for(LL i=N;i<limit;++i) tA[i]=0;
		for(LL i=0;i<M;++i) tB[i]=B[i]; for(LL i=M;i<limit;++i) tB[i]=0;
		Ntt(tA,limit,1); Ntt(tB,limit,1);
		for(LL i=0;i<limit;++i) tA[i]=mul(tA[i],tB[i]);
		Ntt(tA,limit,-1);
		for(LL i=0;i<limit;++i) C[i]=tA[i];
		for(LL i=limit;i<len;++i) C[i]=0;
	}
	void Inv(LL *A,LL N,LL *B){
		if(N==1){
			assert(A[0]);
			B[0]=Pow(A[0],mod-2);
			return;
		}
		LL M(N+1>>1);
		Inv(A,M,B);
		LL limit(Fir(N-1+N-1+M-1));
		static LL tA[maxn],tB[maxn];
		for(LL i=0;i<M;++i) tA[i]=B[i]; for(LL i=M;i<limit;++i) tA[i]=0;
		for(LL i=0;i<N;++i) tB[i]=A[i]; for(LL i=N;i<limit;++i) tB[i]=0;
		Ntt(tA,limit,1); Ntt(tB,limit,1);
		for(LL i=0;i<limit;++i) B[i]=1ll*tA[i]*dec(2,mul(tA[i],tB[i]))%mod;
		Ntt(B,limit,-1);
	}
	void In(LL *A,LL N,LL *B){
		static LL tA[maxn],tB[maxn];
		assert(A[0]==1);
		Inv(A,N,tA);
		for(LL i=0;i<N;++i) tB[i]=mul(A[i+1],i+1);
		Mul(tA,N,tB,N,B,N);
		for(LL i=N-1;i>=1;--i) B[i]=mul(B[i-1],Pow(i,mod-2));
		B[0]=0;
	}
	void Exp(LL *A,LL N,LL *B){
		if(N==1){
			assert(!A[0]);
			B[0]=1;
			return;
		}
		LL M(N+1>>1);
		Exp(A,M,B);
		LL limit(Fir(N-1+N-1));
		static LL tA[maxn],tB[maxn],tC[maxn];
		for(LL i=0;i<M;++i) tA[i]=B[i]; for(LL i=M;i<limit;++i) tA[i]=0;
		for(LL i=M;i<=N;++i) B[i]=0;
		In(B,N+1,tB);
		for(LL i=0;i<N;++i) tC[i]=A[i]; for(LL i=N;i<limit;++i) tC[i]=0;
		limit=(Fir(N-1+N-1));
		Ntt(tA,limit,1); Ntt(tB,limit,1); Ntt(tC,limit,1);
		for(LL i=0;i<limit;++i) B[i]=1ll*tA[i]*(dec(1,dec(tB[i],tC[i])))%mod;//mul(tA[i],dec(1,dec(tB[i],tC[i])));
		Ntt(B,limit,-1);
	}
}
LL n,K;
LL fac[maxn],fav[maxn];
void Fir(LL N){
	fac[0]=1; for(LL i=1;i<=N;++i) fac[i]=mul(fac[i-1],i);
	fav[N]=Pow(fac[N],mod-2); for(LL i=N;i>=1;--i) fav[i-1]=mul(fav[i],i);
}
void Solve(){
	Fir(K);
	static LL tA[maxn],tB[maxn],A[maxn];
	for(LL i=1;i<=K;++i){
		tA[i]=mul(fav[i],Pow(i,K));
	}
	for(LL i=0;i<=K;++i){
		tB[i]=fav[i];
		if(i&1) tB[i]=dec(0,tB[i]);
	}
//	puts("#");
	Poly::Mul(tA,K+1,tB,K+1,A,K+1);
//	puts("#");
	/*
	for(LL j=0;j<=K;++j){
		printf("%d ",A[j]);
	}puts("");
	*/
	LL ret(0);
	for(LL j=0,x=1;j<=std::min(K,n);++j){
//		printf("%d(%d,%d)\n",j,A[j],x);
		LL tmp(A[j]);
		tmp=mul(tmp,x); tmp=mul(tmp,Pow(n+1,n-j));
		ret=add(ret,tmp);
//		printf("# %d\n",tmp);
		x=mul(x,n-j);
	}
//	puts("#");
//	ret=mul(ret,Pow(n+1,mod-2));
	printf("%d\n",ret);
}
int main(){
	Poly::Init();
	n=Read(); K=Read();
	Solve();
	return 0;
}


