#include using namespace std; const int M = 102; const int MX = 1e9 + 7; namespace AC{ const int A = 26; const int off = 'a'; const int MAXN = 102; 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(){ for(int i = 1; i <= V; ++i){ if(prv[i] == 0) fail[i] = 0; else fail[i] = nxt[fail[prv[i]]][last[i]]; for(int j = 0; j < A; ++j) if(nxt[i][j] == 0) nxt[i][j] = nxt[fail[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) 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; matrix fast(matrix a, int b){ matrix ret(true); while(b){ if(b & 1) ret = ret * a; b >>= 1; a = a * a; } return ret; } int main(){ cin >> n >> q; AC::init(); for(int i = 1; i <= q; ++i){ int xd; cin >> xd; string a; cin >> a; AC::add(a); } AC::make(); matrix cur; for(int i = 0; i <= AC::V; ++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; }