#include #include #include #include #include #include using namespace std; typedef long double ld; typedef long long ll; const int MAXN = 105, MOD = 1e9 + 7; template struct Matrix { typedef Matrix M; array, N> d{}; M operator*(const M& m) const { M a; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { a.d[i][j] += (d[i][k]*m.d[k][j])%MOD; a.d[i][j] %= MOD; } } } return a; } vector operator*(const vector &vec) const { vector ret(N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { ret[i] += (d[i][j] * vec[j]) % MOD; ret[i] %= MOD; } } return ret; } M operator^(ll p) const { M a, b(*this); for (int i = 0; i < N; i++) { a.d[i][i] = 1; } while (p) { if (p & 1) a = a * b; b = b * b; p >>= 1; } return a; } }; int n, q, ans; int nxt_node = 1; int par[MAXN]; char parc[MAXN]; bool banned[MAXN]; map nxt[MAXN]; void add(int u, string &s, int i) { if (i == s.size()) { banned[u] = true; return; } char c = s[i]; if (nxt[u].count(c) == 0) { par[nxt_node] = u; parc[nxt_node] = c; nxt[u][c] = nxt_node++; } add(nxt[u][c], s, i + 1); } int find(int u, string &s, int i) { if (i == s.size()) return u; char c = s[i]; if (nxt[u].count(c) == 0) return -1; return find(nxt[u][c], s, i + 1); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> q; for (int i = 0; i < q; i++) { int l; string s; cin >> l >> s; add(0, s, 0); } Matrix mat; for (int i = 0; i < nxt_node; i++) { if (banned[i]) continue; string s = ""; int j = i; while(j != 0) { s.push_back(parc[j]); j = par[j]; } reverse(s.begin(), s.end()); for (char c = 'a'; c <= 'z'; c++) { s.push_back(c); for (int j = 0; j <= s.size(); j++) { int x = find(0, s, j); if (x != -1) { mat.d[i][x]++; break; } } s.pop_back(); } } mat = mat^n; for (int i = 0; i < nxt_node; i++) { if (!banned[i]) ans = (ans+mat.d[0][i]) % MOD; } cout << ans << endl; return 0; }