inlineintread(){ int x = 0, f = 1; char ch = getchar(); for (; ch > '9' || ch < '0'; ch = getchar()) if (ch == '-') f = -1; for (; ch <= '9' && ch >= '0'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ '0'); return x * f; }
constint mod = 10007; int n, m, dp[10005][205], ans; char s[205];
structAC_automaton{ int fail[10005], ch[10005][30], tot; bool tag[10005]; inlinevoidinsert(char *str, int len){ int x = 0; for (int i = 1; i <= len; i++) { if (!ch[x][str[i]-'A']) ch[x][str[i]-'A'] = ++tot; x = ch[x][str[i]-'A']; } tag[x] = 1; } inlinevoidgetfail(){ queue<int> q; for (int i = 0; i < 26; i++) if (ch[0][i]) q.push(ch[0][i]); while (!q.empty()) { int x = q.front(); q.pop(); tag[x] |= tag[fail[x]]; for (int i = 0; i < 26; i++) { if (ch[x][i]) fail[ch[x][i]] = ch[fail[x]][i], q.push(ch[x][i]); else ch[x][i] = ch[fail[x]][i]; } } } inlinevoidDP(){ memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for (int i = 0; i < m; i++) { for (int x = 0; x <= tot; x++) { for (int c = 0; c < 26; c++) { if (!tag[ch[x][c]]) { dp[ch[x][c]][i+1] = (dp[ch[x][c]][i+1] + dp[x][i]) % mod; } } } } ans = 1; for (int i = 1; i <= m; i++) ans = ans * 26 % mod; for (int x = 0; x <= tot; x++) { ans = (ans - dp[x][m] + mod) % mod; } } } T;
intmain(){ n = read(), m = read(); for (int i = 1; i <= n; i++) { scanf("%s", s + 1); T.insert(s, strlen(s + 1)); } T.getfail(); T.DP(); printf("%d\n", ans); return0; }