#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define R22(r) sim> typename enable_if<1 r sizeof(dud(0)),muu&>::type operator<<(c g) { sim> struct rge {c b, e;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c*r)->decltype(cerr << *r); sim> char dud(...); struct muu { #ifdef LOCAL stringstream a; ~muu() {cerr << a.str() << endl;} R22(<) a << boolalpha << g; ris;} R22(==) ris << range(begin(g), end(g));} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } sim, class b mor pair r){ris << "(" << r.first << ", " << r.second << ")";} #else sim mor const c&){ris;} #endif }; #define debug muu() << __FUNCTION__ << "#" << __LINE__ << ": " #define imie(r...) "[" #r ": " << (r) << "] " #define range(a, b) "[[" #a ", " #b "): " << range(a, b) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " using ll = long long; using ld = long double; using pii = pair ; const int mod = 1e9 + 7, nax = 102; map states; set banned; char in[nax]; using matr = array,nax>; matr m, ans; int A; matr mul(const matr &a, const matr &b) { matr out; memset(&out, 0, sizeof(out)); for (int i = 0; i < A; ++i) for (int j = 0; j < A; ++j) for (int k = 0; k < A; ++k) out[i][j] = (out[i][j] + a[i][k] * b[k][j]) % mod; return out; } int main() { int n, q; scanf("%d%d", &n, &q); for(int i = 0; i < q; ++i) { scanf("%*d%s", in); string str(in); int l = str.size(); for (int j = 0; j <= l; ++j) { states.insert(make_pair(string(str.begin(), str.begin() + j), 0)); } banned.insert(str); } debug << imie(states) imie(banned); int cou = 0; for (auto &x : states) x.second = cou++; debug << imie(states); for (auto &x : states) { if (banned.count(x.first)) continue; for (char c = 'a'; c <= 'z'; ++c) { string to = x.first + string(1, c); while (!states.count(to)) to.erase(to.begin()); debug << imie(x) imie(c) imie(to); if (!banned.count(to)) m[x.second][states[to]]++; } } A = cou; //~ for (int i = 0; i < A; ++i) //~ debug << range(&m[i][0], &m[i][A]); int exp = n; for (int i = 0; i < A; ++i) ans[i][i] = 1; while (exp) { if (exp % 2) ans = mul(ans, m); m = mul(m, m); exp >>= 1; } ll out = 0; for (int i = 0; i < A; ++i) out += ans[0][i]; out %= mod; printf("%lld\n", out); }