rt.
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m;
namespace AC_Automaton {
const int N = 1e4 + 100;
const int mod = 1e4 + 7;
struct Node {
int trie[26], fail, end;
} tr[N];
int cnt, dp[N][N];
int qpow(int a, int b) {
if (!b) return 1;
int tmp = qpow(a, b / 2) % mod, ans = tmp % mod * tmp % mod;
return (b & 1 ? ans * a % mod : ans);
}
void insert(string s) {
int l = s.size(), tot = 0;
s = ' ' + s;
for (int i = 1; i <= l; i++) {
int c = s[i] - 'A';
if (!tr[tot].trie[c]) {
tr[tot].trie[c] = ++cnt;
}
tot = tr[tot].trie[c];
}
tr[tot].end = 1;
}
void getfail() {
queue<int> q;
for (int i = 0; i < 26; i++) {
if (tr[0].trie[i]) {
q.push(tr[0].trie[i]);
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < 26; i++) {
if (tr[u].trie[i]) {
// cout << tr[u].trie[i] << endl;
tr[tr[u].trie[i]].fail = tr[tr[u].fail].trie[i];
tr[tr[u].trie[i]].end |= tr[tr[tr[u].trie[i]].fail].end;
q.push(tr[u].trie[i]);
} else {
tr[u].trie[i] = tr[tr[u].fail].trie[i];
}
}
}
}
void solve() {
dp[0][0] = 1;
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= cnt; j++) {
for (int k = 0; k < 26; k++) {
if (!tr[tr[i].trie[k]].end) {
(dp[i][tr[i].trie[k]] += dp[i - 1][j]) %= mod;
}
}
}
}
int ans = 0;
for (int i = 0; i <= cnt; i++) {
(ans += dp[m][i]) %= mod;
}
cout << (qpow(26, m) - ans + mod) % mod << endl;
}
}
signed main() {
using namespace AC_Automaton;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
AC_Automaton::insert(s);
}
// cout << "hi\n";
AC_Automaton::getfail();
// cout << "hi\n";
AC_Automaton::solve();
return 0;
}