#include using namespace std; //#define FOR(i, n) for(int i = 0; i < (n); ++i) #define f first #define s second #define pb push_back #define all(x) x.begin(), x.end() #define vi vector #define sz(x) ((int)(x).size()) typedef long long ll; #define FOR2(i,b,e) for(int i=(b); i<=(e); i++) #define SIZE(x) ((int)x.size()) const int N=110; const int mod=1e9+7; int n, m; vector slowa; bool usun[N]; int G[N][N], tab[N][N], pom[N][N]; const int K = 26; int lit(char x){ return x-'a'; } struct Vertex{ int next[K]; int leaf = -1; int p = -1; char pch; int link = -1; int go[K]; Vertex(int _p = -1, char ch='$'): p(_p), pch(ch){ fill(begin(next), end(next), -1); fill(begin(go), end(go), -1); } }; vector t(1); void add_string(string const& s, int id){ int v = 0; for(char ch: s){ int c = lit(ch); if(t[v].next[c] == -1){ t[v].next[c] = t.size(); t.emplace_back(v, ch); } v = t[v].next[c]; } t[v].leaf = id; } int go(int v, char ch); int get_link(int v){ if(t[v].link == -1){ if(v == 0 || t[v].p == 0){ t[v].link = 0; } else{ t[v].link = go(get_link(t[v].p), t[v].pch); } } return t[v].link; } int go(int v, char ch){ int c = lit(ch); if(t[v].go[c] == -1){ if(t[v].next[c] != -1){ t[v].go[c] = t[v].next[c]; } else{ t[v].go[c] = v == 0 ? 0 : go(get_link(v), ch); } } return t[v].go[c]; } bool pod(string &a, string &b){ FOR2(i, 0, SIZE(b)-SIZE(a)){ if(a == b.substr(i, SIZE(a))) return 1; } return 0; } void buduj(){ for(int i = 0 ; i < sz(t); i++){ if(t[i].leaf != -1){ G[i][i] = 26; } else{ for(char j = 'a'; j <= 'z'; j++){ G[i][go(i, j)]++; } } } } #define FOR FOR2 void kwadrac(){ FOR(i, 0, N-1) FOR(j, 0, N-1) pom[i][j]=G[i][j]; FOR(i, 0, N-1) FOR(j, 0, N-1) G[i][j]=0; FOR(i, 0, N-1){ FOR(j, 0, N-1){ FOR(k, 0, N-1){ G[i][j]=(G[i][j]+(ll)pom[i][k]*pom[k][j])%mod; } } } } void domnoz(){ FOR2(i, 0, N-1) FOR2(j, 0, N-1) pom[i][j]=tab[i][j]; FOR2(i, 0, N-1) FOR2(j, 0, N-1) tab[i][j]=0; FOR2(i, 0, N-1){ FOR2(j, 0, N-1){ FOR2(k, 0, N-1){ tab[i][j]=(tab[i][j]+(ll)pom[i][k]*G[k][j])%mod; } } } } void poteguj(int exp){ FOR2(i, 0, N-1) tab[i][i]=1; while(exp){ if(exp&1) domnoz(); kwadrac(); exp>>=1; } } int pov(int base, int exp){ int ret=1; while(exp){ if(exp&1) ret=((ll)ret*base)%mod; base=((ll)base*base)%mod; exp>>=1; } return ret; } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(0); cin>>n>>m; int sum = 0; FOR2(i, 1, m){ int a; string s; cin>>a>>s; sum += a; slowa.pb(s); } assert(sum <= 100); sort(slowa.begin(), slowa.end()); slowa.erase(unique(slowa.begin(), slowa.end()), slowa.end()); FOR(i, 0, SIZE(slowa)-1){ FOR2(j, 0, SIZE(slowa)-1){ if(i!=j && pod(slowa[i], slowa[j])) usun[j]=1; } } FOR2(i, 0, SIZE(slowa)-1){ if(!usun[i]) add_string(slowa[i], i+1); } buduj(); /*FOR(i, 0, 3){ FOR(j, 0, 3){ cout<= 0); assert(((pov(26, n)-ans)%mod+mod)%mod < mod); cout<<((pov(26, n)-ans)%mod+mod)%mod<<'\n'; return 0; }