#include using namespace std; typedef long long ll; const int mod = 1e9+7; string s[110]; vector > g; int rem[310][310]; queue > q; int k; ll ansm[110][110], aa[110][110], c[110][110]; void binpow(ll y){ for (int i = 0; i <= k; i++) for (int j = 0; j <= k; j++) ansm[i][j] = aa[i][j]; --y; while(y){ if (y & 1){ for (int i = 0; i <= k; i++){ for (int j = 0; j <= k; j++){ c[i][j] = 0; for (int l = 0; l <= k; l++) c[i][j] = (c[i][j] + ansm[i][l] * aa[l][j])%mod; } } for (int i = 0; i <= k; i++) for (int j = 0; j <= k; j++) ansm[i][j] = c[i][j]; } y>>=1; for (int i = 0; i <= k; i++){ for (int j = 0; j <= k; j++){ c[i][j] = 0; for (int l = 0; l <= k; l++) c[i][j] = (c[i][j] + aa[i][l] * aa[l][j])%mod; } } for (int i = 0; i <= k; i++) for (int j = 0; j <= k; j++) aa[i][j] = c[i][j]; } } 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}); while(!q.empty()){ int pos = q.front().first, len = q.front().second; q.pop(); string scp = s[pos].substr(0, len); if (len == 0) scp = ""; 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].size() >= sz && s[l].substr(0, sz) == ss){ nxtpos = l; nxtlen = sz; break; } } if (nxtpos != -1) break; ss.erase(0, 1); } if (nxtpos == -1){ ++aa[rem[pos][len]][1]; } else { if (rem[nxtpos][nxtlen] == 0){ rem[nxtpos][nxtlen] = ++k; g.push_back({nxtpos, nxtlen}); q.push({nxtpos, nxtlen}); } ++aa[rem[pos][len]][rem[nxtpos][nxtlen]]; } } } binpow(n); ll ans = 0; for (int i = 1; i <= k; i++){ ans = (ans + ansm[1][i])%mod; } cout << ans; }