E869120 defined a sequence $a$ like this:


* $a_1=a_2=1$, $a_{k+2}=a_{k+1}+a_k \ (k \ge 1)$


He also defined sequences $d_1, d_2, d_3, \dots , d_n$, as the following recurrence relation :


* $d_{1, j} = a_j$
* $d_{i, j} = \sum_{k = 1}^j d_{i - 1, k} \ (i \ge 2)$


You are given integers $n$ and $m$. Please calculate the value of $d_{n, m}$.
Since the answer can be large number, print the answer modulo $998,244,353$.
Can you solve this problem???

Input

The input is given from standard input in the following format.



> $n \quad m$

Output

* Print $d_{n, m}$ modulo $998,244,353$.



Constraints

* $1 \le n \le 200,000$
* $1 \le m \le 10^{18}$



Subtasks

Subtask 1 [ $100$ points ]


* The testcase in this subtask satisfies $1 \le n, m \le 3,000$.

Subtask 2 [ $170$ points ]


* The testcase in this subtask satisfies $1 \le m \le 200,000$.

Subtask 3 [ $230$ points ]


* The testcase in this subtask satisfies $1 \le n \le 3$.

Subtask 4 [ $420$ points ]


* The testcase in this subtask satisfies $1 \le n \le 1000$.

Subtask 5 [ $480$ points ]


* There are no additional constraints.

Output

* Print $d_{n, m}$ modulo $998,244,353$.



Constraints

* $1 \le n \le 200,000$
* $1 \le m \le 10^{18}$



Subtasks

Subtask 1 [ $100$ points ]


* The testcase in this subtask satisfies $1 \le n, m \le 3,000$.

Subtask 2 [ $170$ points ]


* The testcase in this subtask satisfies $1 \le m \le 200,000$.

Subtask 3 [ $230$ points ]


* The testcase in this subtask satisfies $1 \le n \le 3$.

Subtask 4 [ $420$ points ]


* The testcase in this subtask satisfies $1 \le n \le 1000$.

Subtask 5 [ $480$ points ]


* There are no additional constraints.

Input

The input is given from standard input in the following format.



> $n \quad m$

Examples

Input

4 7


Output

176


Input

12 20


Output

174174144


Input

16 30


Output

102292850

#include<deque>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<tuple>
#include<string>
#include<chrono>
#include<functional>
#include<iterator>
#include<random>
#include<unordered_set>
#include<array>
#include<map>
#include<iomanip>
#include<assert.h>
#include<bitset>
#include<stack>
#include<memory>
using namespace std;
using namespace std::chrono;
typedef long long int llint;
typedef double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase
/*cout<<fixed<<setprecision(20);cin.tie(0);ios::sync_with_stdio(false);*/
const llint mod=998244353;
const llint big=2.19e15+1;
const long double pai=3.141592653589793238462643383279502884197;
const long double eps=1e-15;
template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;}
template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;}
llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);}
llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;}
template<class T> void SO(T& ve){sort(ve.begin(),ve.end());}
template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());}
template<class T>llint LBI(vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();}
template<class T>llint UBI(vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();}
pair<llint,llint>enz(pair<llint,llint>ans,pair<llint,llint>bgen){
	pair<llint,llint>ata;
	ata.fir=ans.fir*bgen.sec+(ans.sec-ans.fir)*bgen.fir;
	ata.sec=ans.fir*bgen.fir+ans.sec*bgen.sec;
	ata.fir%=mod;ata.sec%=mod;
	return ata;
}
llint fib(llint in){
	pair<llint,llint>ans=mp(0,1);//0,1
	//0,1項目
	pair<llint,llint>bgen=mp(1,1);//1,2項
	for(int h=0;h<60;h++){
		if((1LL<<h)&in){ans=enz(ans,bgen);}//ans<-bgen
		bgen=enz(bgen,bgen);
	}
	//cerr<<"fib in="<<in<<"num="<<ans.fir<<endl;
	return ans.fir;
}
int countt=0;
llint gya(llint in){
	if(in%mod==0){countt++;return 1;}
	in%=mod;
	llint ans=1,bgen=in;
	for(int h=0;h<30;h++){
		if((mod-2)&(1LL<<h)){ans*=bgen;ans%=mod;}
		bgen*=bgen;bgen%=mod;
	}
	return ans;
}
int main(void){
	llint n,m;cin>>n>>m;n--;
	llint ans=fib(n+n+m);
	llint gen=1;
	for(llint i=0;i<n;i++){
		if(countt==0){ans-=gen;}
		//cerr<<gen<<endl;
		gen*=gya(i+1);gen%=mod;
		gen*=gya(n+n+m-i-1);gen%=mod;
		if((n+n+m-i-i-2)%mod>0){gen*=(n+n+m-i-i-2)%mod;gen%=mod;}else{countt--;}
		if((n+n+m-i-i-1)%mod>0){gen*=(n+n+m-i-i-1)%mod;gen%=mod;}else{countt--;}
		
	}
	ans%=mod;ans+=mod;ans%=mod;
	cout<<ans<<endl;
	return 0;
}

