#include <bits/stdc++.h>
using namespace std;
/*
/\_/\ /\_/\ /\_/\ /\_/\
( o.o )( o.o )( o.o )( o.o )
> ^ < > ^ < > ^ < > ^ <
/\_/\ /\_/\
( o.o ) ghelopax ( o.o )
> ^ < > ^ <
/\_/\ /\_/\ /\_/\ /\_/\
( o.o )( o.o )( o.o )( o.o )
> ^ < > ^ < > ^ < > ^ <
*/
#define ll long long
#define ldb long double
const int maxN = 8;
const int maxLen = 10;
const int maxL = 100;
const int APB = 26;
const ll MOD = 998244353;
const int INF = 1e9;
const ll INFLL = 4e18;
const int LG = 20;
#define el "\n"
#define pb push_back
#define eb emplace_back
#define MASK(i) (1LL << (i))
#define BIT(msk, i) (((msk) >> (i)) & 1LL)
#define MID(l, r) ((l) + (((r) - (l)) >> 1))
#define lsb(x) ((x) & -(x))
#define FOR(i, l, r) for (int i = (l); i <= (int)(r); ++i)
#define FORLL(i, l, r) for (ll i = (l); i <= (ll)(r); ++i)
#define isz(v) (int)v.size()
void add(ll &x, ll w)
{
x += w;
if (x > MOD) x -= MOD;
}
int N, L;
vector<string> inp;
void input()
{
cin >> N >> L;
FOR(i, 1, N)
{
string s; cin >> s;
inp.pb(s);
}
}
namespace Subtask_1
{
const int NodeCnt = maxN * maxLen;
bool constraint()
{
return true;
}
struct Trie
{
struct Node
{
int nxt[APB];
int id;
} T[NodeCnt + 5];
Trie()
{
memset(T[0].nxt, -1, sizeof(T[0].nxt));
T[0].id = -1;
}
int cnt = 0;
int newnode()
{
++cnt;
memset(T[cnt].nxt, -1, sizeof(T[cnt].nxt));
T[cnt].id = -1;
return cnt;
}
void insert(int id, string s)
{
int u = 0;
for (char ch : s)
{
int c = ch - 'a';
if (T[u].nxt[c] == -1)
T[u].nxt[c] = newnode();
u = T[u].nxt[c];
}
T[u].id = id;
}
bool exist(int u, int c) { return T[u].nxt[c] != -1; }
int next(int u, int c) { return T[u].nxt[c]; }
};
struct Aho_Corasick
{
Trie trie;
int fail[NodeCnt + 5];
int aut[NodeCnt + 5][APB];
int exit[NodeCnt + 5];
void insert(int id, string s)
{
trie.insert(id, s);
}
void build()
{
queue<int> q;
fail[0] = 0;
exit[0] = 0;
FOR(c, 0, APB - 1)
{
int v = trie.next(0, c);
if (v == -1) aut[0][c] = 0;
else
{
aut[0][c] = v;
fail[v] = 0;
exit[v] = 0;
q.push(v);
}
}
while (!q.empty())
{
int u = q.front(); q.pop();
FOR(c, 0, APB - 1)
{
int v = trie.next(u, c);
if (v == -1) aut[u][c] = aut[fail[u]][c];
else
{
fail[v] = aut[fail[u]][c];
exit[v] = (trie.T[fail[v]].id == -1 ? exit[fail[v]] : fail[v]);
aut[u][c] = v;
q.push(v);
}
}
}
}
vector<int> getid(int u)
{
vector<int> res;
while (u != 0)
{
res.pb(trie.T[u].id);
u = exit[u];
}
return res;
}
};
struct LexicographicDP
{
Aho_Corasick ac;
ll dp[maxL + 5][NodeCnt + 5][MASK(maxN) + 5];
void init()
{
FOR(i, 0, N - 1)
ac.insert(i, inp[i]);
ac.build();
memset(dp, -1, sizeof(dp));
}
ll count(int pos, int u, int msk)
{
ll &memo = dp[pos][u][msk];
if (memo != -1) return memo;
if (pos == L) return (msk == MASK(N) - 1);
memo = 0;
FOR(c, 0, APB - 1)
{
int v = ac.aut[u][c];
vector<int> ids = ac.getid(v);
int _msk = msk;
if (!ids.empty()) for (int id : ids)
_msk |= MASK(id);
add(memo, count(pos + 1, v, _msk));
}
return memo;
}
} lxc;
void preprocess()
{
lxc.init();
}
void solve() // or: void query()
{
cout << lxc.count(0, 0, 0);
}
void run()
{
preprocess();
solve(); // or: while(Q--) query();
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// freopen(".inp", "r", stdin);
// freopen(".out", "w", stdout);
input();
if (Subtask_1::constraint()) return Subtask_1::run(), 0;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLyoKIC9cXy9cICAvXF8vXCAgL1xfL1wgIC9cXy9cCiggby5vICkoIG8ubyApKCBvLm8gKSggby5vICkKID4gXiA8ICA+IF4gPCAgPiBeIDwgID4gXiA8CiAvXF8vXCAgICAgICAgICAgICAgICAvXF8vXAooIG8ubyApICAgZ2hlbG9wYXggICAoIG8ubyApCiA+IF4gPCAgICAgICAgICAgICAgICA+IF4gPAogL1xfL1wgIC9cXy9cICAvXF8vXCAgL1xfL1wKKCBvLm8gKSggby5vICkoIG8ubyApKCBvLm8gKQogPiBeIDwgID4gXiA8ICA+IF4gPCAgPiBeIDwKKi8KCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGRiIGxvbmcgZG91YmxlCgpjb25zdCBpbnQgbWF4TiA9IDg7CmNvbnN0IGludCBtYXhMZW4gPSAxMDsKY29uc3QgaW50IG1heEwgPSAxMDA7CmNvbnN0IGludCBBUEIgPSAyNjsKY29uc3QgbGwgTU9EID0gOTk4MjQ0MzUzOwpjb25zdCBpbnQgSU5GID0gMWU5Owpjb25zdCBsbCBJTkZMTCA9IDRlMTg7CmNvbnN0IGludCBMRyA9IDIwOwoKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgTUFTSyhpKSAoMUxMIDw8IChpKSkKI2RlZmluZSBCSVQobXNrLCBpKSAoKChtc2spID4+IChpKSkgJiAxTEwpCiNkZWZpbmUgTUlEKGwsIHIpICgobCkgKyAoKChyKSAtIChsKSkgPj4gMSkpCiNkZWZpbmUgbHNiKHgpICgoeCkgJiAtKHgpKQojZGVmaW5lIEZPUihpLCBsLCByKSBmb3IgKGludCBpID0gKGwpOyBpIDw9IChpbnQpKHIpOyArK2kpCiNkZWZpbmUgRk9STEwoaSwgbCwgcikgZm9yIChsbCBpID0gKGwpOyBpIDw9IChsbCkocik7ICsraSkKI2RlZmluZSBpc3oodikgKGludCl2LnNpemUoKQoKdm9pZCBhZGQobGwgJngsIGxsIHcpCnsKICAgIHggKz0gdzsKICAgIGlmICh4ID4gTU9EKSB4IC09IE1PRDsKfQoKaW50IE4sIEw7CnZlY3RvcjxzdHJpbmc+IGlucDsKCnZvaWQgaW5wdXQoKQp7CiAgICBjaW4gPj4gTiA+PiBMOwoKICAgIEZPUihpLCAxLCBOKQogICAgewogICAgICAgIHN0cmluZyBzOyBjaW4gPj4gczsKICAgICAgICBpbnAucGIocyk7CiAgICB9Cn0KCm5hbWVzcGFjZSBTdWJ0YXNrXzEKewogICAgY29uc3QgaW50IE5vZGVDbnQgPSBtYXhOICogbWF4TGVuOwoKICAgIGJvb2wgY29uc3RyYWludCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgc3RydWN0IFRyaWUKICAgIHsKICAgICAgICBzdHJ1Y3QgTm9kZQogICAgICAgIHsKICAgICAgICAgICAgaW50IG54dFtBUEJdOwogICAgICAgICAgICBpbnQgaWQ7CiAgICAgICAgfSBUW05vZGVDbnQgKyA1XTsKCiAgICAgICAgVHJpZSgpCiAgICAgICAgewogICAgICAgICAgICBtZW1zZXQoVFswXS5ueHQsIC0xLCBzaXplb2YoVFswXS5ueHQpKTsKICAgICAgICAgICAgVFswXS5pZCA9IC0xOwogICAgICAgIH0KCiAgICAgICAgaW50IGNudCA9IDA7CgogICAgICAgIGludCBuZXdub2RlKCkKICAgICAgICB7CiAgICAgICAgICAgICsrY250OwogICAgICAgICAgICBtZW1zZXQoVFtjbnRdLm54dCwgLTEsIHNpemVvZihUW2NudF0ubnh0KSk7CiAgICAgICAgICAgIFRbY250XS5pZCA9IC0xOwogICAgICAgICAgICByZXR1cm4gY250OwogICAgICAgIH0KCiAgICAgICAgdm9pZCBpbnNlcnQoaW50IGlkLCBzdHJpbmcgcykKICAgICAgICB7CiAgICAgICAgICAgIGludCB1ID0gMDsKICAgICAgICAgICAgZm9yIChjaGFyIGNoIDogcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGMgPSBjaCAtICdhJzsKCiAgICAgICAgICAgICAgICBpZiAoVFt1XS5ueHRbY10gPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgVFt1XS5ueHRbY10gPSBuZXdub2RlKCk7CgogICAgICAgICAgICAgICAgdSA9IFRbdV0ubnh0W2NdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBUW3VdLmlkID0gaWQ7CiAgICAgICAgfQoKICAgICAgICBib29sIGV4aXN0KGludCB1LCBpbnQgYykgeyByZXR1cm4gVFt1XS5ueHRbY10gIT0gLTE7IH0KICAgICAgICBpbnQgbmV4dChpbnQgdSwgaW50IGMpIHsgcmV0dXJuIFRbdV0ubnh0W2NdOyB9CiAgICB9OwoKICAgIHN0cnVjdCBBaG9fQ29yYXNpY2sKICAgIHsKICAgICAgICBUcmllIHRyaWU7CiAgICAgICAgaW50IGZhaWxbTm9kZUNudCArIDVdOwogICAgICAgIGludCBhdXRbTm9kZUNudCArIDVdW0FQQl07CiAgICAgICAgaW50IGV4aXRbTm9kZUNudCArIDVdOwoKICAgICAgICB2b2lkIGluc2VydChpbnQgaWQsIHN0cmluZyBzKQogICAgICAgIHsKICAgICAgICAgICAgdHJpZS5pbnNlcnQoaWQsIHMpOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBidWlsZCgpCiAgICAgICAgewogICAgICAgICAgICBxdWV1ZTxpbnQ+IHE7CgogICAgICAgICAgICBmYWlsWzBdID0gMDsKICAgICAgICAgICAgZXhpdFswXSA9IDA7CiAgICAgICAgICAgIEZPUihjLCAwLCBBUEIgLSAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgdiA9IHRyaWUubmV4dCgwLCBjKTsKICAgICAgICAgICAgICAgIGlmICh2ID09IC0xKSBhdXRbMF1bY10gPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGF1dFswXVtjXSA9IHY7CiAgICAgICAgICAgICAgICAgICAgZmFpbFt2XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgZXhpdFt2XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoIXEuZW1wdHkoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHUgPSBxLmZyb250KCk7IHEucG9wKCk7CiAgICAgICAgICAgICAgICBGT1IoYywgMCwgQVBCIC0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IHRyaWUubmV4dCh1LCBjKTsKICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAtMSkgYXV0W3VdW2NdID0gYXV0W2ZhaWxbdV1dW2NdOwogICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmYWlsW3ZdID0gYXV0W2ZhaWxbdV1dW2NdOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0W3ZdID0gKHRyaWUuVFtmYWlsW3ZdXS5pZCA9PSAtMSA/IGV4aXRbZmFpbFt2XV0gOiBmYWlsW3ZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgYXV0W3VdW2NdID0gdjsKICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmVjdG9yPGludD4gZ2V0aWQoaW50IHUpCiAgICAgICAgewogICAgICAgICAgICB2ZWN0b3I8aW50PiByZXM7CiAgICAgICAgICAgIHdoaWxlICh1ICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlcy5wYih0cmllLlRbdV0uaWQpOwogICAgICAgICAgICAgICAgdSA9IGV4aXRbdV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9CiAgICB9OwoKICAgIHN0cnVjdCBMZXhpY29ncmFwaGljRFAKICAgIHsKICAgICAgICBBaG9fQ29yYXNpY2sgYWM7CiAgICAgICAgbGwgZHBbbWF4TCArIDVdW05vZGVDbnQgKyA1XVtNQVNLKG1heE4pICsgNV07CgogICAgICAgIHZvaWQgaW5pdCgpCiAgICAgICAgewogICAgICAgICAgICBGT1IoaSwgMCwgTiAtIDEpCiAgICAgICAgICAgICAgICBhYy5pbnNlcnQoaSwgaW5wW2ldKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGFjLmJ1aWxkKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YoZHApKTsKICAgICAgICB9CgogICAgICAgIGxsIGNvdW50KGludCBwb3MsIGludCB1LCBpbnQgbXNrKQogICAgICAgIHsKICAgICAgICAgICAgbGwgJm1lbW8gPSBkcFtwb3NdW3VdW21za107CiAgICAgICAgICAgIGlmIChtZW1vICE9IC0xKSByZXR1cm4gbWVtbzsKICAgICAgICAgICAgaWYgKHBvcyA9PSBMKSByZXR1cm4gKG1zayA9PSBNQVNLKE4pIC0gMSk7CgogICAgICAgICAgICBtZW1vID0gMDsKICAgICAgICAgICAgRk9SKGMsIDAsIEFQQiAtIDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCB2ID0gYWMuYXV0W3VdW2NdOwogICAgICAgICAgICAgICAgdmVjdG9yPGludD4gaWRzID0gYWMuZ2V0aWQodik7CiAgICAgICAgICAgICAgICBpbnQgX21zayA9IG1zazsKICAgICAgICAgICAgICAgIGlmICghaWRzLmVtcHR5KCkpIGZvciAoaW50IGlkIDogaWRzKQogICAgICAgICAgICAgICAgICAgIF9tc2sgfD0gTUFTSyhpZCk7CgogICAgICAgICAgICAgICAgYWRkKG1lbW8sIGNvdW50KHBvcyArIDEsIHYsIF9tc2spKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1lbW87CiAgICAgICAgfQogICAgfSBseGM7CiAgICAKICAgIHZvaWQgcHJlcHJvY2VzcygpCiAgICB7CiAgICAgICAgbHhjLmluaXQoKTsKICAgIH0KCiAgICB2b2lkIHNvbHZlKCkgLy8gb3I6IHZvaWQgcXVlcnkoKQogICAgewogICAgICAgIGNvdXQgPDwgbHhjLmNvdW50KDAsIDAsIDApOwogICAgfQoKICAgIHZvaWQgcnVuKCkKICAgIHsKICAgICAgICBwcmVwcm9jZXNzKCk7CiAgICAgICAgc29sdmUoKTsgLy8gb3I6IHdoaWxlKFEtLSkgcXVlcnkoKTsKICAgIH0KfQoKc2lnbmVkIG1haW4oKQp7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY291dC50aWUobnVsbHB0cik7CgogICAgLy8gZnJlb3BlbigiLmlucCIsICJyIiwgc3RkaW4pOwogICAgLy8gZnJlb3BlbigiLm91dCIsICJ3Iiwgc3Rkb3V0KTsKCiAgICBpbnB1dCgpOwoKICAgIGlmIChTdWJ0YXNrXzE6OmNvbnN0cmFpbnQoKSkgcmV0dXJuIFN1YnRhc2tfMTo6cnVuKCksIDA7CgogICAgcmV0dXJuIDA7Cn0=