#include using namespace std; typedef long long ll; typedef double lf; typedef pair pii; typedef pair pll; #define TRACE(x) cerr << #x << ' ' << x << endl #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define REP(i, n) FOR(i, 0, n) #define _ << ' ' << #define fi first #define sec second #define se second #define mp make_pair #define pb push_back const int MAXN = 110; const int MOD = 1e9 + 7; int a[MAXN][MAXN], tmp[MAXN][MAXN], sol[MAXN][MAXN]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; set S, T; vector V; for (int i = 0; i < q; i++) { int len; cin >> len; string s; cin >> s; S.insert(s); } for (string s : S) { for (int j = 0; j < (int)s.length(); j++) { string t = s.substr(0, j); if (!S.count(t)) T.insert(t); } } for (string s : T) V.push_back(s); int m = V.size(); for (int i = 0; i < m; i++) { string s = V[i]; for (char c = 'a'; c <= 'z'; c++) { string t = s + c; if (S.count(t)) continue; while (!T.count(t)) t = t.substr(1); int j = 0; while (V[j] != t) j++; a[j][i]++; } } for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) if (i == j) sol[i][j] = 1; else sol[i][j] = 0; for (int exp = 0; exp < 32; exp++) { if ((1 << exp) & n) { for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) { tmp[i][j] = 0; for (int k = 0; k < m; k++) tmp[i][j] = (tmp[i][j] + (ll)a[i][k] * sol[k][j]) % MOD; } for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) sol[i][j] = tmp[i][j]; } for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) { tmp[i][j] = 0; for (int k = 0; k < m; k++) tmp[i][j] = (tmp[i][j] + (ll)a[i][k] * a[k][j]) % MOD; } for (int i = 0; i < m; i++) for (int j = 0; j < m; j++) a[i][j] = tmp[i][j]; } int total = 0; for (int i = 0; i < m; i++) total = (total + sol[i][0]) % MOD; cout << total; return 0; }