#include <bits/stdc++.h>
using namespace std;

const int maxn = 200;
const int mod = 998244353;
typedef long long ll;

struct Matrix{
	int n,m;
	int a[200][200],ans[200][200],ans2[200][200];
	void clear(){
		for(int i=0;i<n;++i)for(int j=0;j<m;++j)a[i][j]=0;
	}
	void init(int nn,int mm){
		n=nn,m=mm;
		clear();
	}
	void set_I(){
		for(int i=0;i<n;++i)for(int j=0;j<m;++j){
			a[i][j]=(i==j);
		}
	}
	void qpow(int k){
		for(int i=0;i<n;++i){
			for(int j=0;j<n;++j){
				ans[i][j]=(i==j);
			}
		}
		while(k){
			if(k&1){
				for(int i=0;i<n;++i)for(int j=0;j<n;++j)ans2[i][j]=ans[i][j];
				for(int i=0;i<n;++i){
					for(int j=0;j<n;++j){
						ans[i][j]=0;
						for(int h=0;h<n;++h){
							ans[i][j]=(ans[i][j]+1ll*a[i][h]*ans2[h][j]%mod)%mod;
						}
					}
				}
			}
			k>>=1;
			for(int i=0;i<n;++i)for(int j=0;j<n;++j)ans2[i][j]=a[i][j];
			for(int i=0;i<n;++i){
				for(int j=0;j<n;++j){
					a[i][j]=0;
					for(int h=0;h<n;++h){
						a[i][j]=(a[i][j]+1ll*ans2[i][h]*ans2[h][j]%mod)%mod;
					}
				}
			}
		}
		for(int i=0;i<n;++i)for(int j=0;j<n;++j)a[i][j]=ans[i][j];
	}
	void mul(Matrix &A){
		for(int i=0;i<n;++i){
			for(int j=0;j<A.m;++j){
				ans[i][j]=0;
				for(int k=0;k<A.n;++k){
					ans[i][j]=(ans[i][j]+1ll*a[i][k]*A.a[k][j]%mod)%mod;
				}
			}
		}
		m=A.m;
		for(int i=0;i<n;++i)for(int j=0;j<m;++j)a[i][j]=ans[i][j];
	}
}M,A;

int ch[maxn][26],tot,mark[maxn],mp[maxn][maxn],idtot;
char s[maxn],lins[maxn];
array<int,2>id[maxn*maxn];
void insert(char *s,int len){
	int u=0;
	for(int i=0;i<len;++i){
		if(!ch[u][s[i]-'a']){
			ch[u][s[i]-'a']=++tot;
		}
		u=ch[u][s[i]-'a'];
	}
	mark[u]=1;
}
void dfs(int u,int dep){
	for(int i=0;i<dep;++i){
		int now=0;
		for(int j=i;j<dep;++j){
			now=ch[now][lins[j]-'a'];
			if(!now)break;
		}
		if(!now)continue;
		mp[u][now]=mp[now][u]=idtot++;
		id[idtot-1]={now,u};
	}
	mp[u][0]=mp[0][u]=idtot++,id[idtot-1]={0,u};
	for(int i=0;i<26;++i){
		int v=ch[u][i];
		if(!v)continue;
		lins[dep]=i+'a';
		dfs(v,dep+1);
	}
}


int main(){
	memset(mp,-1,sizeof(mp));
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i){
		scanf("%s",s);
		insert(s,strlen(s));
	}
	dfs(0,0);
	M.init(idtot,idtot);
	A.init(idtot,1);
//	for(int i=0;i<idtot;++i){
//		printf("%d %d,%d\n",i,id[i][0],id[i][1]);
//	}
	for(int i=0;i<idtot;++i){
		int u=id[i][0],v=id[i][1];
		for(int j=0;j<26;++j){
			vector<int>gu,gv;
			if(ch[u][j])gu.push_back(ch[u][j]);
			if(ch[v][j])gv.push_back(ch[v][j]);
			if(mark[u] && ch[0][j])gu.push_back(ch[0][j]);
			if(mark[v] && ch[0][j])gv.push_back(ch[0][j]);
			for(auto nu:gu){
				for(auto nv:gv){
					if(mp[nu][nv]==-1)continue;
					int idd=mp[nu][nv];
					if(u==v){
						if(nu==nv)M.a[idd][i]=1;
						else if(nu!=nv)M.a[idd][i]=2;
					}else M.a[idd][i]=1;
				}
			}
		}
	}
//	for(int i=0;i<M.n;++i){
//		for(int j=0;j<M.m;++j)printf("%d ",M.a[i][j]);
//		puts("");
//	}
	A.a[0][0]=1;
	M.qpow(m);M.mul(A);
	int ans=0;
	for(int i=0;i<idtot;++i){
		int u=id[i][0],v=id[i][1];
		if(!mark[u] || !mark[v])continue;
		ans=(ans+M.a[i][0])%mod;
	}
	printf("%d\n",ans);
}