#include using namespace std; typedef long long ll; const int mod = 1e9+7; string s[110]; vector > g; int rem[1010][1010]; queue > q; struct matr{ ll a[1010][1010]; void clr(){ for (int i = 0; i <= k; i++) for (int j = 0; j <= k; j++) a[i][j] = 0; } }; int k; matr operator * (matr fi, matr se){ matr th; th.clr(); for (int i = 0; i <= k; i++){ for (int j = 0; j <= k; j++){ for (int l = 0; l <= k; l++){ th.a[i][j] = (th.a[i][j] + fi.a[i][l] * se.a[l][j])%mod; } } } return th; } matr binpow(matr x, ll y){ matr ans = x; --y; while(y){ if (y & 1) ans = ans * x; y>>=1; x = x * x; } return ans; } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n, qq; cin >> n >> qq; for (int i = 1; i <= qq; i++){ int sz; cin >> sz; cin >> s[i]; } k = 1; g.push_back({0, 0}); rem[0][0] = 1; q.push({0, 0}); matr aa; aa.clr(); while(!q.empty()){ int pos = q.front().first, len = q.front().second; q.pop(); string scp = s[pos].substr(0, len); for (char c = 'a'; c <= 'z'; c++){ string ss = scp + c; int nxtpos = -1, nxtlen = -1; bool flag = 1; for (int i = 1; i <= qq; i++){ if (s[i] == ss){ flag = 0; break; } } if (flag == 0) continue; while(!ss.empty()){ int sz = ss.size(); for (int l = 1; l <= qq; l++){ if (s[l].substr(0, sz) == ss){ nxtpos = l; nxtlen = sz; break; } } if (nxtpos != -1) break; ss.erase(0, 1); } if (nxtpos == -1){ ++aa.a[rem[pos][len]][1]; } else { if (rem[nxtpos][nxtlen] == 0){ rem[nxtpos][nxtlen] = ++k; g.push_back({nxtpos, nxtlen}); q.push({nxtpos, nxtlen}); } ++aa.a[rem[pos][len]][rem[nxtpos][nxtlen]]; } } } if (k > 102) assert(0); matr ansm = binpow(aa, n); ll ans = 0; for (int i = 1; i <= k; i++){ ans = (ans + ansm.a[1][i])%mod; } cout << ans; }