#include using namespace std; #define int long long const int M = 110; const int MX = 1e9 + 7; namespace AC{ const int A = 26; const int off = 'a'; const int MAXN = 110; int V; bool finish[MAXN]; int prv[MAXN]; int fail[MAXN]; int last[MAXN]; int nxt[MAXN][A]; void init(){ V = 0; prv[0] = -1; fail[0] = 0; } void create(){ ++V; for(int i = 0; i < A; ++i) nxt[V][i] = 0; fail[V] = 0; } void add(string &s){ int cur = 0; for(auto c: s){ if(nxt[cur][c - off] == 0){ create(); prv[V] = cur; last[V] = c - off; nxt[cur][c - off] = V; } cur = nxt[cur][c - off]; } finish[cur] = true; } void make(){ queue Q; for(int i = 1; i <= V; ++i) if(prv[i] == 0){ fail[i] = 0; Q.push(i); } while(!Q.empty()){ int i = Q.front(); Q.pop(); if(prv[i] != 0) fail[i] = nxt[fail[prv[i]]][last[i]]; finish[i] |= finish[prv[i]]; finish[i] |= finish[fail[i]]; for(int j = 0; j < A; ++j) if(nxt[i][j] == 0) nxt[i][j] = nxt[fail[i]][j]; else Q.push(nxt[i][j]); } } } struct matrix{ int t[M][M]; matrix(bool id = false){ for(int i = 0; i < M; ++i) for(int j = 0; j < M; ++j) t[i][j] = 0; if(id) for(int i = 0; i < M; ++i) t[i][i] = 1; } }; matrix operator*(matrix a, matrix b){ matrix ret; for(int i = 0; i < M; ++i) for(int j = 0; j < M; ++j) { ret.t[i][j] = 0; for(int k = 0; k < M; ++k) ret.t[i][j] = (ret.t[i][j] + 1LL * a.t[i][k] * b.t[k][j]) % MX; } return ret; } int n, q; string s[M]; matrix fast(matrix a, int b){ matrix ret(true); for(int i = 0; i < M; i++) for(int j = 0; j < M; j++) ret.t[i][j] = (i == j ? 1 : 0); while(b){ if(b & 1) ret = ret * a; b >>= 1; a = a * a; } return ret; } bool zawiera(string a, string b){ for(int i = 0; i < (int)a.size(); ++i){ bool ok = true; for(int j = 0; j < (int)b.size(); ++j){ if(i + j >= (int)a.size()){ ok = false; break; } ok &= a[i + j] == b[j]; } if(ok) return true; } return false; } int32_t main(){ cin >> n >> q; assert(n > 0 && q > 0); AC::init(); for(int i = 1; i <= q; ++i){ int xd; cin >> xd; assert(xd > 0); cin >> s[i]; } while(true){ int id = -1; for(int i = 1; i <= q; ++i) for(int j = 1; j <= q; ++j) if(i != j && zawiera(s[i], s[j])){ id = i; break; } if(id == -1) break; for(int i = id + 1; i <= q; ++i) s[i - 1] = s[i]; q--; } for(int i = 1; i <= q; ++i) AC::add(s[i]); AC::make(); matrix cur; for(int i = 0; i < M; i++) for(int j = 0; j < M; j++) cur.t[i][j] = 0; for(int i = 0; i <= AC::V; ++i){ /* printf("%d %d :: ", AC::fail[i], AC::finish[i]); for(int j = 0; j < 26; ++j) printf("%d ", AC::nxt[i][j]); puts(""); */ if(!AC::finish[i]){ for(int j = 0; j < 26; ++j) cur.t[i][AC::nxt[i][j]]++; } } int ret = 0; matrix ans = fast(cur, n); for(int i = 0; i <= AC::V; ++i) if(!AC::finish[i]) ret = (ret + ans.t[0][i]) % MX; cout << ret << "\n"; return 0; } /* 4 5 2 ac 3 adc 4 cbbd 2 ba 3 cbd 0 0 :: 1 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :: 1 9 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 :: 1 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :: 1 9 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 :: 1 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :: 1 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :: 1 7 5 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :: 1 9 5 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 :: 1 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 :: 10 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 :: 1 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 :: 1 9 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 452924 cteam001:~$ cat k2.out 452873 */