#include <bits/stdc++.h>
using namespace std;
const int N = 50, M = 161, MOD = 998244353;
struct matrix
{
	int val[M][M];
	matrix() { memset(val, 0, sizeof(val)); }
	matrix operator * (const matrix &oth) const
	{
		matrix res;
		for(int i = 0; i < M; i++)
			for(int j = 0; j < M; j++)
				for(int k = 0; k < M; k++)
					res.val[i][j] = (res.val[i][j] + 1LL * val[i][k] * oth.val[k][j] % MOD) % MOD;
		return res;
	}
} trans; 
matrix Qpow(matrix a, long long power)
{
	matrix res;
	for(int i = 0; i < M; i++) res.val[i][i] = 1;
	while(power)
	{
		if(power & 1) res = res * a;
		a = a * a;
		power >>= 1;
	}
	return res;
}
struct trie
{
	int siz;
	struct node
	{
		bool ext;
		int ch[26];
		node() { ext = false; memset(ch, -1, sizeof(ch)); }
	} o[N];
	trie() { siz = 0; } 
	void Insert(char *str)
	{
		int cur = 0;
		for(int i = 1; str[i]; i++)
		{
			if(o[cur].ch[str[i] - 'a'] == -1) o[cur].ch[str[i] - 'a'] = ++siz;
			cur = o[cur].ch[str[i] - 'a'];
		}
		o[cur].ext = true;
	}
} tr;
int n;
long long m;
char s[N];
queue<pair<int, int>> que;
map<pair<int, int>, int> idx;
int GetID(pair<int, int> p)
{
	if(p.first > p.second) swap(p.first, p.second);
	if(!idx.count(p))
	{
		int k = idx.size();
		idx[p] = k;
		que.push(p);
	}
	return idx[p];
}
int main()
{
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		cin >> (s + 1);
		tr.Insert(s); 
	}
	que.push(make_pair(0, 0));
	idx[make_pair(0, 0)] = 0;
	while(!que.empty())
	{
		pair<int, int> cur = que.front();
		que.pop();
		int x = GetID(cur);
		for(int c = 0; c < 26; c++)
		{
			pair<int, int> nxt = make_pair(tr.o[cur.first].ch[c], tr.o[cur.second].ch[c]);
			if(nxt.first == -1 || nxt.second == -1) continue;
			trans.val[x][GetID(nxt)]++;
			if(tr.o[nxt.first].ext) trans.val[x][GetID(make_pair(0, nxt.second))]++;
			if(tr.o[nxt.second].ext) trans.val[x][GetID(make_pair(nxt.first, 0))]++;
			if(tr.o[nxt.first].ext && tr.o[nxt.second].ext) trans.val[x][0]++;
		}
	}
	cout << Qpow(trans, m).val[0][0] << endl; 
	return 0;
}