#include using namespace std; #define int long long const int M = 150; const int MX = 1000 * 1000 * 1000 + 7; namespace AC{ const int A = 26; const int off = 'a'; const int MAXN = 150; int V = 0; int 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; } bool check(string a){ while(a.size()){ if(M.count(a) && finish[M[a]]) return true; reverse(a.begin(), a.end()); a.pop_back(); reverse(a.begin(), a.end()); } return false; } 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(); } if(tmp.size()){ finish[v.second] |= check(tmp); tmp.pop_back(); finish[v.second] |= finish[M[tmp]]; } } } } typedef long long LL; typedef vector < vector < LL > > matrix; matrix operator* (matrix a, matrix b) { int n = a.size(); matrix r(n, vector < LL > (n, 0)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int k = 0; k < n; k++) { r[i][j] = (r[i][j] + a[i][k] * b[k][j]) % MX; } } } return r; } matrix fast(matrix a, int y) { assert(y > 0); matrix r = a; y--; while(y > 0) { if(y & 1) r = r * a; a = a * a; y /= 2; } return r; } int n, q; string s[M]; int32_t main(){ cin >> n >> q; assert(n > 0 && q > 0); AC::init(); int sum = 0; for(int i = 1; i <= q; ++i){ int xd; cin >> xd; assert(xd > 0); cin >> s[i]; for(auto c: s[i]) assert('a' <= c && c <= 'z'); assert((int)s[i].size() == xd); sum += xd; } assert(sum <= 100); for(int i = 1; i <= q; ++i) AC::add(s[i]); AC::make(); int zz = AC::V + 1; matrix cur(zz, vector (zz, 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[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[0][i]) % MX; assert(0 <= ret && ret < MX); cout << ret << "\n"; return 0; }