#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
const int maxt=105;
const int mod=100000;
int n,m;
int tot;
char a[105];
struct aho
{
int cnt;
int fail[maxt],to[maxt][5];
bool danger[maxt];
int q[maxt];
aho()
{
cnt=1;
fail[1]=0;
for(int i=1;i<=4;i++)
{
to[0][i]=1;
}
}
int idx(char k)
{
if(k=='A') return 1;
if(k=='T') return 2;
if(k=='C') return 3;
if(k=='G') return 4;
}
void insert(char *s)
{
int n=strlen(s+1);
int now=1;
for(int i=1;i<=n;i++)
{
int c=idx(s[i]);
if(to[now][c]) now=to[now][c];
else
{
to[now][c]=++cnt;
now=to[now][c];
}
}
danger[now]=1;
}
void build()
{
int head=0,tail=1;
q[0]=1;
while(head<tail)
{
int k=q[head++];
for(int i=1;i<=4;i++)
{
if(to[k][i])
{
int tmp=fail[k];
while(!to[tmp][i]) tmp=fail[tmp];
fail[to[k][i]]=to[tmp][i];
if(danger[to[tmp][i]])danger[to[k][i]]=1;
q[tail++]=to[k][i];
}
}
}
}
}T;
struct M
{
ll v[maxt][maxt];
M()
{
memset(v,0,sizeof(v));
}
friend M operator *(M a,M b)
{
M c;
for(int i=1;i<=tot;i++)
{
for(int j=1;j<=tot;j++)
{
for(int k=1;k<=tot;k++)
{
c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j])%mod;
}
}
}
return c;
}
friend M operator ^(M a,int k)
{
M c;
for(int i=1;i<=tot;i++)
{
c.v[i][i]=1;
}
for(int i=k;i;i>>=1,a=a*a)
{
if(i&1) c=c*a;
}
return c;
}
void printt(M a)
{
for(int i=1;i<=tot;i++)
{
for(int j=1;j<=tot;j++)
printf("%lld ",a.v[i][j]);
printf("\n");
}
}
}b;
void solve()
{
tot=T.cnt;
// cout<<tot<<endl;
for(int i=1;i<=tot;i++)
{
if(T.danger[i]) continue;
for(int j=1;j<=4;j++)
{
int tmp=i;
while(!T.to[tmp][j])tmp=T.fail[tmp];
if(!T.danger[T.to[tmp][j]])b.v[T.to[tmp][j]][i]++;
}
}
// b.printt(b);
M ans;
ans.v[1][1]=1;
ans=(b^n)*ans;
ll res=0;
for(int i=1;i<=tot;i++)
{
res=(res+ans.v[i][1])%mod;
}
printf("%lld\n",res);
}
int main()
{
// char a[105];
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%s",a+1);
T.insert(a);
}
T.build();
solve();
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=6007;
const int mod=10007;
int n,m;
int sz=1,ans1,ans2=1;
int a[maxn][27],failptr[maxn];
int f[107][maxn];
char s[107];
int que[maxn];
bool danger[maxn];
void ins()
{
int now=1,c;
int len=strlen(s);
for(int i=0;i<len;i++)
{
c=s[i]-'A'+1;
if(a[now][c])now=a[now][c];
else
{
a[now][c]=++sz;
now=a[now][c];
}
}
danger[now]=1;
}
void acmach()
{
int head=0,tail=1;
int now;
que[0]=1;
failptr[1]=0;
while(head<tail)
{
now=que[head++];
for(int i=1;i<=26;i++)
{
if(!a[now][i]) continue;
int tmp=failptr[now];
while(!a[tmp][i]) tmp=failptr[tmp];
failptr[a[now][i]]=a[tmp][i];
if(danger[a[tmp][i]]) danger[a[now][i]]=1;
que[tail++]=a[now][i];
}
}
}
void dp(int k)
{
for(int i=1;i<=sz;i++)
{
if(danger[i]||!f[k-1][i]) continue;
for(int j=1;j<=26;j++)
{
int tmp=i;
while(!a[tmp][j]) tmp=failptr[tmp];
f[k][a[tmp][j]]=(f[k][a[tmp][j]]+f[k-1][i])%mod;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=26;i++)a[0][i]=1;//OMG
for(int i=1;i<=n;i++)
{
scanf("%s",s);
ins();
}
// cout<<111<<endl;
acmach();
// printf("444");
f[0][1]=1;
for(int i=1;i<=m;i++)dp(i);
for(int i=1;i<=m;i++)
ans2=(ans2*26)%mod;
for(int i=1;i<=sz;i++)
{
if(!danger[i]) ans1=(ans1+f[m][i])%mod;
}
// cout<<ans1<<endl;
printf("%d",(ans2-ans1+mod)%mod);
}