#include <bits/stdc++.h>   using namespace std;   const int MOD = 1e9 + 7;   const int MAXN = 205;   const int infint = 1e9;   const long long inf = 1e18;   const int K = 26;   long long n, l, a[MAXN], nxt[MAXN][K], used[MAXN];   string s[MAXN];   struct Vertex {     int next[K];     bool leaf = false;     long long val = 0;     int p = -1;     char pch;     int f = -1;     int go[K];     Vertex(int p = -1, char ch =  $ ) : p(p), pch(ch) {       memset(next, -1, sizeof next);       memset(go, -1, sizeof go);     }   };   vector<Vertex> t(1);   void add_string(string const &s, int value) {     int v = 0;     for (int i = 0; i < s.size(); i++) {       int c = s[i] -  a ;       if (t[v].next[c] == -1) {         t[v].next[c] = t.size();         Vertex child = Vertex(v, s[i]);         t.push_back(child);       }       v = t[v].next[c];     }     t[v].leaf = 1;     t[v].val += value;   }   int go(int v, char ch);   int get_link(int v) {     if (t[v].f == -1) {       if (v == 0 || t[v].p == 0)         t[v].f = 0;       else         t[v].f = go(get_link(t[v].p), t[v].pch);     }     return t[v].f;   }   int go(int v, char ch) {     int c = ch -  a ;     if (t[v].go[c] == -1) {       if (t[v].next[c] != -1)         t[v].go[c] = t[v].next[c];       else         t[v].go[c] = v == 0 ? 0 : go(get_link(v), ch);     }     return t[v].go[c];   }   void upd(int c) {     if (used[c]) return;     used[c] = 1;     if (c == 0) return;     upd(t[c].f);     t[c].val += t[t[c].f].val;   }   struct matrix {     long long a[MAXN][MAXN], n, m;     matrix(long long Cn, long long Cm) {       n = Cn, m = Cm;       for (long long i = 0; i < n; i++)         for (long long j = 0; j < m; j++) a[i][j] = -infint;     }     long long *operator[](const long long &i) { return a[i]; }     matrix Identity(const long long &n) {       matrix c(n, m);       return c;     }     inline matrix operator*(matrix &b) {       matrix c(n, b.m);       for (int i = 0; i < n; i++)         for (int j = 0; j < b.m; j++)           for (int k = 0; k < m; k++)             if (a[i][k] >= 0 && b[k][j] >= 0)               c[i][j] = max(c[i][j], (long long)a[i][k] + (long long)b[k][j]);       return c;     }     inline matrix operator+(matrix b) {       matrix c(n, m);       for (int i = 0; i < n; i++)         for (int j = 0; j < m; j++) c[i][j] = (a[i][j] + b[i][j]) % MOD;       return c;     }     matrix operator^(const long long &c) {       if (c == 0) return Identity(n);       if (c == 1) return *this;       matrix tmp = *this ^ (c >> 1);       tmp = tmp * tmp;       if (c & 1) tmp = tmp * *this;       return tmp;     }     void inline print() {       for (int i = 0; i < n; i++) {         for (int j = 0; j < m; j++) cout << a[i][j] <<    ;         cout <<   n ;       }     }   };   matrix cost(MAXN, MAXN);   matrix base(1, MAXN);   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n >> l;     for (int i = 0; i < n; i++) cin >> a[i];     for (int i = 0; i < n; i++) cin >> s[i];     for (int i = 0; i < n; i++) add_string(s[i], a[i]);     for (int i = 0; i < t.size(); i++)       for (int j = 0; j < K; j++) nxt[i][j] = go(i, (char)(j +  a ));     for (int i = 1; i < t.size(); i++) upd(i);     cost.n = cost.m = t.size();     for (int i = 0; i < t.size(); i++)       for (int j = 0; j < t.size(); j++) cost[i][j] = -inf;     for (int i = 0; i < t.size(); i++)       for (int j = 0; j < K; j++) cost[i][nxt[i][j]] = t[nxt[i][j]].val;     cost = cost ^ l;     base.n = 1;     base.m = t.size();     base[0][0] = 0;     for (int i = 1; i < t.size(); i++) base[0][i] = -inf;     base = base * cost;     long long ans = 0;     for (int i = 0; i < t.size(); i++) ans = max(ans, base[0][i]);     cout << ans;   }