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>
using namespace std;
template<class t> inline t read(t &x){
	char c=getchar();bool f=0;x=0;
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	if(f) x=-x;return x;
}
template<class t> inline void write(t x){
	if(x<0) putchar('-'),write(-x);
	else{if(x>9) write(x/10);putchar('0'+x%10);}
}

#define poly vector<int>

const int mod=998244353;

int fpow(int x,int y){
	int res=1;
	for(;y;y>>=1,x=1ll*x*x%mod) if(y&1) res=1ll*res*x%mod;
	return res;
}

namespace Poly{
	
	int plus(int x,int y){
		return x+y>=mod?x+y-mod:x+y;
	}
	
	int minu(int x,int y){
		return x>=y?x-y:x-y+mod;
	}
	
	int Mod(int x){
		return x<0?x+mod:x>=mod?x-mod:x;
	}
	
	int Get(int x){
		int res=1;
		while(res<x) res<<=1;
		return res;
	}
	
	vector<int> pos,w;
	
	void init(int n){
		pos.resize(n);w.resize(n);
		for(int i=0;i<n;i++) pos[i]=pos[i>>1]>>1|((i&1)*(n>>1));
		for(int i=1;i<n;i<<=1){
			int wn=fpow(3,(mod-1)/i/2);w[i]=1;
			for(int j=1;j<i;j++) w[i+j]=1ll*w[i+j-1]*wn%mod;
		}
	}
	
	void dft(poly &f,int n){
		f.resize(n);
		for(int i=0;i<n;i++) if(i<pos[i]) swap(f[i],f[pos[i]]);
		for(int i=1;i<n;i<<=1)
			for(int j=0;j<n;j+=i<<1)
				for(int k=0;k<i;k++){
					int x=f[j+k],y=1ll*f[i+j+k]*w[i+k]%mod;
					f[j+k]=plus(x,y);
					f[i+j+k]=minu(x,y);
				}
	}
	
	void idft(poly &f,int n){
		dft(f,n);reverse(f.begin()+1,f.end());
		for(int i=0,iv=fpow(n,mod-2);i<n;i++) f[i]=1ll*f[i]*iv%mod;
	}
	
	poly Mul(poly a,poly b){
		if(a.size()<=20||b.size()<=20){
			poly c;c.resize(a.size()+b.size()-1);
			for(int i=0;i<a.size();i++) for(int j=0;j<b.size();j++)
				c[i+j]=plus(c[i+j],1ll*a[i]*b[j]%mod);
			return c;
		}
		int n=a.size()+b.size()-1,m=Get(n);
		init(m);dft(a,m);dft(b,m);
		for(int i=0;i<m;i++) a[i]=1ll*a[i]*b[i]%mod;
		idft(a,m);a.resize(n);
		return a;
	}
	
}

int n,ans,k;
poly fac;

poly stirling(int n){
	fac.resize(n+1);
	poly inv(n+1),f(n+1),g(n+1);
	fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
	inv[n]=fpow(fac[n],mod-2);for(int i=n-1;~i;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
	for(int i=0;i<=n;i++) f[i]=((i&1?-1ll:1ll)*inv[i]%mod+mod)%mod,g[i]=1ll*fpow(i,n)*inv[i]%mod;
	return f=Poly::Mul(f,g),f.resize(n+1),f;
}

signed main(){
	read(n);read(k);
	poly S=stirling(k);
	for(int i=1,C=1;i<=k&&i<=n;i++) C=1ll*C*(n-i+1)%mod,ans=(ans+1ll*S[i]*C%mod*fpow(n+1,n-i))%mod;
	write(ans);
}