#include #define FOR(i,s,e) for(int i=(s); i<=(e); i++) #define FORD(i,s,e) for(int i=(s); i>=(e); i--) #define ALL(k) (k).begin(),(k).end() #define e1 first #define e2 second #define pb push_back #define int long long using namespace std; string inslo[105], slo[105]; int pocz[105], block[105]; int mac[105][105]; bool srt(string &a, string &b) { return a.size() < b.size(); } const int N = 103, mod = 1000000007; struct macierz { int t[105][105]; macierz() { for (int i=0; i= (int)b.size() || a[j] != b[j+i]) { ok=0; break; } } if (ok == 1) return true; } return false; } const int MAXN = 111; int ls[MAXN]; char a[MAXN][MAXN]; int confid[MAXN]; int confpos[MAXN]; char confval[MAXN][MAXN]; macierz chgs; int32_t main() { int n, q;scanf("%lld%lld", &n,&q); chgs.t[0][0] = 26; // 0 - rubbish int curconf = 1; FOR(i,1,q){ int l; scanf("%lld", &l); ls[i] = l; scanf("%s", a[i]); FOR(j,0,l-1){ curconf++; confid[curconf] = i; confpos[curconf] = j+1; FOR(k,0,j-1) confval[curconf][k] = a[i][k]; reverse(confval[curconf], confval[curconf] + j); } } FOR(c1,1,curconf){ for(char let = 'a'; let <= 'z'; let++){ int best = 1; int len = 0; FOR(c2, 2, curconf){ if(c2 == c1) continue; int l1 = confpos[c1], l2 = confpos[c2]; if (l2 > l1 + 1) continue; if(confval[c2][0] != let) continue; bool ok = true; FOR(i, 1, l2-1){ if (confval[c2][i] != confval[c1][i-1]){ ok = false; break; } } if (!ok) continue; if (l2 == ls[confid[c2]]){ best = 0; break; } if (l2 > len){ best = c2; len = l2; } } chgs.t[c1][best]++; } } macierz odp = pot(chgs, n); macierz start; start.t[1][1] = 1; macierz ans = mnoz(start, odp); int finalans = 0; FOR(i,1, curconf){ finalans += ans.t[1][i]; finalans %= mod; } printf("%lld\n", finalans); }