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

#define LL long long

const int maxN = 45, maxM = 205, mod = 998244353;

int n, M, m, cnt;
int ch[maxN + 1][26], f[maxN + 1][maxN + 1];
int dep[maxN + 1], res[maxM + 1], g[6][maxN + 1][maxN + 1];
bool flag[maxN + 1];

struct Matrix
{
	int a[maxM + 1][maxM + 1];

	void clear() { memset(a, 0, sizeof(a)); }

	void set() { clear(); for(int i = 0; i < m; i++) a[i][i] = 1; }

	Matrix operator * (Matrix rhs)
	{
		Matrix ans;
		for(int i = 0; i < m; i++)
			for(int j = 0; j < m; j++)
			{
				LL t = 0;
				for(int k = 0; k < m; k++)
					t += 1ll * a[i][k] * rhs.a[k][j] % mod;
				ans.a[i][j] = t % mod;
			}
		return ans;
	}
};

inline void update(int &x, int y) { x = x + y >= mod ? x + y - mod : x + y; }

inline Matrix mpow(Matrix a, int x)
{
	Matrix ans; ans.set();
	while(x)
	{
		if(x & 1) ans = ans * a;
		a = a * a;
		x >>= 1;
	}
	return ans;
}

int main()
{
	scanf("%d %d", &n, &M);
	
	cnt = 1;
	for(int i = 1; i <= n; i++)
	{
		char s[10];
		scanf("%s", s + 1);
		int len = strlen(s + 1), cur = 0;
		for(int j = 1; j <= len; j++)
		{
			int c = s[j] - 'a';
			if(!ch[cur][c]) ch[cur][c] = cnt ++;
			cur = ch[cur][c];
			dep[cur] = j;
		}
		flag[cur] = true;
	}

	m = 5 * cnt;
	Matrix A; A.clear();
	for(int s = 0; s < cnt; s++)
	{
		memset(f, 0, sizeof(f));
		f[0][s] = 1;
		for(int i = 0; i < cnt; i++)
			for(int j = cnt - 1; j >= 0; j--)
			{
				if(!f[i][j]) continue;
				int res = f[i][j];
				if(flag[j] && i) update(f[i][0], res); 
				for(int c = 0; c < 26; c++)
				{
					if(!ch[i][c] || !ch[j][c]) continue;
					update(f[ ch[i][c] ][ ch[j][c] ], res);
				}
			}
		for(int i = 0; i < cnt; i++)
		{
			if(!flag[i]) continue;	
			for(int j = 0; j < cnt; j++)
				update(A.a[ (5 - dep[i]) * cnt + s ][ 4 * cnt + j ], f[i][j]);
		}
	}

	g[0][0][0] = 1;
	for(int i = 1; i <= 5; i++)
	{
		for(int u = 0; u < cnt; u++)
			for(int v = 0; v < cnt; v++)
			{
				if(!g[i - 1][u][v]) continue;
				int res = g[i - 1][u][v];
				for(int c = 0; c < 26; c++)
				{
					if(!ch[u][c] || !ch[v][c]) continue;
					update(g[i][ ch[u][c] ][ ch[v][c] ], res);
				}
			}
		for(int u = cnt - 1; u >= 0; u--)
			for(int v = cnt - 1; v >= 0; v--)
			{
				if(!g[i][u][v] || !u || !v) continue;
				int res = g[i][u][v];
				if(flag[u]) update(g[i][0][v], res);
				if(flag[v]) update(g[i][u][0], res);
				if(flag[u] && flag[v]) update(g[i][0][0], res);
			}
		for(int j = 0; j < cnt; j++) res[ (i - 1) * cnt + j ] = g[i][0][j];
	}

	for(int i = 1; i <= 4; i++)
		for(int j = 0; j < cnt; j++)
			A.a[ i * cnt + j ][ (i - 1) * cnt + j ] = 1;	
	
	A = mpow(A, M - 1);

	int ans = 0;
	for(int i = 0; i < m; i++) update(ans, 1ll * res[i] * A.a[i][0] % mod);

	printf("%d\n", ans);
	return 0;
}
