#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define ldb long double
#define mt make_tuple
const int N=100050;
const int L=25;
const int mod=998244353;
const int inf=1e9+7;
int n,m,b[N],c,sol,bsol;
void input()
{
	scanf("%i %i",&n,&m);
	for(int i=1;i<=m;i++) scanf("%i",&b[i]);
	scanf("%i",&c);
	c%=mod;
	if(c<0) c+=mod;
}
void output()
{
	printf("%i\n",sol);
}
int par[N][L],a[N],mx[N];
void Solve()
{
	for(int i=1;i<=m;i++) a[i]=i;
	for(int j=1;j<=m;j++)
		a[b[j]]=a[j];
	for(int i=1;i<=m;i++) par[i-1][0]=a[i];
	par[m][0]=-1;
	for(int j=1;j<L;j++) for(int i=0;i<=m;i++)
	{
		if(par[i][j-1]==-1) par[i][j]=-1;
		else par[i][j]=par[par[i][j-1]][j-1];
	}
	for(int i=0;i<=m;i++)
	{
		if(par[i][L-1]!=-1) mx[i]=inf;
		else
		{
			mx[i]=0;
			int u=i;
			for(int j=L-1;~j;j--) if(par[u][j]!=-1) u=par[u][j],mx[i]+=1<<j;
			mx[i]++;
		}
	}
	sol=0;
	int mul=c;
	int zero=0;
	for(int i=1;i<=n;i++)
	{
		int pos;
		if(zero!=-1) zero=par[zero][0];
		if(i+m>n)
		{
			int po=n-m+1;
			pos=i-(n-m+1);
			if(mx[pos]>po)
			{
				for(int k=0;k<L;k++) if((po>>k)&1) pos=par[pos][k];
			}
			else
			{
				pos=po-mx[pos]+m+1;
			}
		}
		else
		{
			int po=i;
			pos=0;
			if(mx[pos]>po)
			{
				pos=zero;
				//for(int k=0;k<L;k++) if((po>>k)&1) pos=par[pos][k];
			}
			else
			{
				pos=po-mx[pos]+m+1;
			}
		}
		sol+=(ll)mul*pos%mod;
		if(sol>=mod) sol-=mod;
		mul=(ll)mul*c%mod;
		//printf("%i ",pos);
	}
	//printf("\n");
}
void BruteForce()
{
	bsol=0;
	for(int i=1;i<=n;i++) a[i]=i;
	for(int i=0;i<=n-m;i++)
		for(int j=1;j<=m;j++)
			a[i+b[j]]=a[i+j];
	int mul=c;
	for(int i=1;i<=n;i++)
	{
		bsol+=(ll)mul*a[i]%mod;
		if(bsol>=mod) bsol-=mod;
		mul=(ll)mul*c%mod;
		//printf("%i ",a[i]);
	}
	//printf("\n");
}
void Run()
{
	input();
	Solve();
	//BruteForce();
	output();
}
void MakeTestCase()
{
	n=10000;
	m=5000;
	for(int i=1;i<=m;i++) b[i]=rand()%m+1;
	c=rand()%mod;
}
bool Compare()
{
	return sol==bsol;
}
void Print()
{
	printf("%i %i %i\n",n,m,c);
	for(int i=1;i<=m;i++) printf("%i ",b[i]);
	printf("\n");
	printf("Solve: %i\n",sol);
	printf("Brute: %i\n",bsol);
}
double GetTime(){ return (ldb)clock()/CLOCKS_PER_SEC;}
double s_time,e_time,d_time;
void Start(){ s_time=GetTime();}
void Stop(){ e_time=GetTime();d_time=e_time-s_time;}
void Test()
{
	cout<<fixed<<setprecision(4);
	int work=100000;
	double max_time=0;
	bool speed_only=0;
	for(int i=1;i<=work;i++)
	{
		MakeTestCase();
		if(!speed_only) BruteForce();
		Start();
		Solve();
		Stop();
		if(!speed_only && !Compare())
		{
			Print();
			return;
		}
		max_time=max(max_time,d_time);
		cout<<i<<":OK, max time so far="<<max_time<<"\n";
	}
	cout<<":D\n";
}
int main()
{
	bool test=0;
	if(test) Test();
	else Run();
	return 0;
}