#include using namespace std; using ll = long long; using Vi = vector; using Pii = pair; #define mp make_pair #define pb push_back #define x first #define y second #define rep(i,b,e) for(int i = (b); i < (e); i++) #define each(a, x) for(auto& a : (x)) #define all(x) (x).begin(),(x).end() #define sz(x) int((x).size()) #define tem template #define pri(x,y)tem auto operator<<(t& o, u a)->decltype(x,o) { o << y; return o; } pri(a.print(), "{"; a.print(); "}"); pri(a.y, "(" << a.x << ", " << a.y << ")"); pri(all(a), "["; auto d=""; for (auto i : a) (o << d << i, d = ", "); o << "]"); void DD(...) {} tem void DD(t s, u a, w... k) { for (int b = 44; *s && *s - b; cerr << *s++) b += ((*s == 41) - (*s == 40)) * 88; cerr << ": " << a << *s++; DD(s, k...); } tem vector span(const t* a, u n) { return {a, a+n}; } #ifdef LOC #define deb(...) (DD("[,\b :] "#__VA_ARGS__, __LINE__, __VA_ARGS__), cerr << endl) #else #define deb(...) #endif #define DBP(...) void print() { DD(#__VA_ARGS__, __VA_ARGS__); } constexpr char AMIN = 'a'; constexpr int ALPHA = 26; struct Aho { vector> nxt{1}; Vi suf = {-1}, accLink = {-1}; vector accept{1}; bool isAcc(int i) { return !accept[i].empty() || accLink[i] > 0; } int add(const string& str, int id) { int i = 0; each(c, str) { if (!nxt[i][c-AMIN]) { nxt[i][c-AMIN] = sz(nxt); nxt.pb({}); suf.pb(-1); accLink.pb(1); accept.pb({}); } i = nxt[i][c-AMIN]; } accept[i].pb(id); return i; } void build() { queue que; each(e, nxt[0]) if (e) { suf[e] = 0; que.push(e); } while (!que.empty()) { int i = que.front(), s = suf[i], j = 0; que.pop(); each(e, nxt[i]) { if (e) que.push(e); (e ? suf[e] : e) = nxt[s][j++]; } accLink[i] = (accept[s].empty() ? accLink[s] : s); } } }; constexpr ll MOD = 1e9+7; using Mat = vector>; Mat mul(const Mat& a, const Mat& b) { int n = sz(a); Mat c(n, vector(n)); rep(i, 0, n) { rep(j, 0, n) { ll tmp = 0; rep(k, 0, n) { tmp += a[i][k] * b[k][j] % MOD; } c[i][j] = tmp % MOD; } } return c; } Mat matPow(Mat a, ll e) { Mat t(sz(a), vector(sz(a))); rep(i, 0, sz(a)) t[i][i] = 1; while (e) { if (e % 2) t = mul(t, a); e /= 2; a = mul(a, a); } return t; } int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(12); int n, q; cin >> n >> q; Aho aho; rep(i, 0, q) { int l; cin >> l; string s; cin >> s; aho.add(s, i+1); } aho.build(); int dim = sz(aho.nxt); Mat mat(dim, vector(dim)); rep(i, 0, dim) { if (aho.isAcc(i)) continue; rep(a, 0, ALPHA) { int j = aho.nxt[i][a]; if (aho.isAcc(j)) continue; mat[i][j]++; } } deb(mat, dim); Mat res = matPow(mat, n); ll ans = 0; deb(res); rep(i, 0, dim) { ans += res[0][i]; ans %= MOD; } ans %= MOD; if (ans < 0) ans += MOD; cout << ans << endl; return 0; }