#include using namespace std; #define int long long const int M = 110; const int MX = 1e9 + 7; 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; } namespace AC{ const int A = 26; const int off = 'a'; const int MAXN = 110; int V = 0; bool finish[MAXN]; map M; string st[MAXN]; int nxt[MAXN][26]; void init(){ V = 0; for(int i = 0; i < MAXN; ++i){ for(int j = 0; j < 26; ++j) nxt[i][j] = 0; finish[i] = false; } M[""] = 0; } void add(string s){ string cur; for(auto c: s){ cur.push_back(c); if(!M.count(cur)) M[cur] = ++V; } finish[M[cur]] = true; } int get(string a){ while(a.size()){ if(M.count(a)) return M[a]; reverse(a.begin(), a.end()); a.pop_back(); reverse(a.begin(), a.end()); } return 0; } void make(){ for(auto v: M){ string tmp = v.first; for(char c = 'a'; c <= 'z'; ++c){ tmp.push_back(c); nxt[v.second][c - off] = get(tmp); tmp.pop_back(); } } } } 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; } 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; }