#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e4+7;
int n,m,ans=0;
int tr[6005][26],ne[6005],cnt[6005],wrong[6005],idx=0;
int dp[105][6005];
char str[105];
int my_pow(int x)
{
int res=1;
for(int i=1;i<=x;++i) res=(res*26)%mod;
return res;
}
void insert()
{
int u=0;
for(int i=0;str[i];++i)
{
int to=str[i]-'A';
if(!tr[u][to]) tr[u][to]=++idx;
u=tr[u][to];
}
++cnt[u];
}
void build_AC()
{
queue<int> q;
for(int i=0;i<26;++i)
{
if(tr[0][i]) q.push(tr[0][i]);
}
while(!q.empty())
{
int now=q.front();
q.pop();
if(cnt[now]) wrong[now]=true;
for(int i=0;i<26;++i)
{
int c=tr[now][i];
if(!c) tr[now][i]=tr[ne[now]][i];
else
{
ne[c]=tr[ne[now]][i];
wrong[c]|=wrong[tr[ne[now]][i]];
q.push(c);
}
}
}
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%s",str);
insert();
}
build_AC();
dp[0][0]=1;
for(int i=0;i<m;++i)
{
for(int j=0;j<=idx;++j)
{
for(int k=0;k<26;++k)
{
int to=tr[j][k];
if(!wrong[to]) dp[i+1][to]=(dp[i+1][to]+dp[i][j])%mod;
}
}
}
ans=my_pow(m);
for(int i=0;i<=idx;++i)
{
ans=((ans-dp[m][i])%mod+mod)%mod;
}
printf("%lld",ans);
return 0;
}