#include #include using namespace std; using ll = long long; const ll M = 1000000007; const ll Qmax = 105; struct matrix { ll szamok[Qmax][Qmax] = {}; const ll* operator [](ll x) const { return szamok[x]; } ll* operator [](ll x) { return szamok[x]; } }; matrix operator *(const matrix& A, const matrix& B) { matrix C; for(ll i = 0; i < Qmax; i++) for(ll j = 0; j < Qmax; j++) for(ll k = 0; k < Qmax; k++) { C[i][k] += (A[i][j] * B[j][k])%M; C[i][k] %= M; } return C; } matrix mpow(matrix A, ll N) { matrix B; for(ll i = 0; i < Qmax; i++) { B[i][i] = 1; } while(N) { if(N & 1) { B = B * A; } A = A * A; N /= 2; } return B; } struct szofa { szofa* hova[26] = {}; szofa* honnan = nullptr; szofa* kov0(char c) { return hova[c - 'a']; } szofa* kov(char c) { szofa*& s = hova[c-'a']; if(!s) { s = new szofa; s->ch = c-'a'; s->honnan = this; } return s; } ll ch; szofa* e = nullptr; bool szv = false; ll id; }; szofa* kov(szofa* e0, ll x, szofa* gy) { while(e0 && !e0->hova[x]) { e0 = e0->e; } if(e0) { return e0->hova[x]; } else { return gy; } } void szamol1(szofa* sz, szofa* gyoker) { szofa* e0 = sz->honnan->e; sz->e = kov(e0, sz->ch, gyoker); } int main() { ll N, Q; cin >> N >> Q; szofa szf; for(ll i = 0; i < Q; i++) { ll _; cin >> _; string s; cin >> s; szofa* cs = &szf; for(char c : s) { cs = cs->kov(c); } cs->szv = true; } vector v; vector v1 = {&szf}; while(v1.size()) { vector v2; for(szofa* cs : v1) { for(szofa* cs2 : cs->hova) { if(cs2) { v2.push_back(cs2); v.push_back(cs2); } } } swap(v1, v2); } for(szofa* sz : v) { szamol1(sz, &szf); sz->szv |= sz->e->szv; }; v.insert(v.begin(), &szf); ll X = 0; for(szofa* sz : v) { sz->id = X++; } matrix m; for(ll i = 0; i < X; i++) { for(ll j = 0; j < 26; j++) { szofa* cs = kov(v[i], j, & szf); if(!cs->szv) m[i][cs->id]++; } } matrix A = mpow(m, N); ll er = 0; for(ll i = 0; i < Qmax; i++) { er += A[0][i]; er %= M; } cout << er << "\n"; }