#include <bits/stdc++.h>
using namespace std;
long long l;
string s;
int n, a[(1 << 8)];
struct AC_Automation {
  long long val[(1 << 8)];
  int cnt, t[(1 << 8)][26], fail[(1 << 8)];
  void Init() {
    cnt = 0;
    memset(t, 0, sizeof(t));
    memset(val, 0, sizeof(val));
    memset(fail, 0, sizeof(fail));
  }
  void Insert(string s, long long v) {
    int cur = 0, l = s.length();
    for (int i = 0; i < l; i++) {
      if (!t[cur][s[i] - 'a']) t[cur][s[i] - 'a'] = ++cnt;
      cur = t[cur][s[i] - 'a'];
    }
    val[cur] += v;
  }
  void BuildFail() {
    queue<int> q;
    q.push(0);
    for (; !q.empty(); q.pop()) {
      int u = q.front();
      for (int i = 0; i < 26; i++) {
        if (!t[u][i])
          t[u][i] = t[fail[u]][i];
        else {
          int v = t[u][i];
          if (u) {
            fail[v] = t[fail[u]][i];
            val[v] += val[t[fail[u]][i]];
          }
          q.push(v);
        }
      }
    }
  }
} Acer;
struct Matrix {
  int n;
  long long a[(1 << 8)][(1 << 8)];
  Matrix(int n, int t) : n(n) {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) a[i][j] = i == j ? t : (-(1LL << 60));
  }
  Matrix operator*(Matrix& b) {
    Matrix c(n, -(1LL << 60));
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        for (int k = 0; k < n; k++)
          c.a[i][j] = max(c.a[i][j], a[i][k] + b.a[k][j]);
    return c;
  }
  Matrix operator^(long long k) {
    Matrix res(n, 0), cur(*this);
    for (; k; k >>= 1, cur = cur * cur)
      if (k & 1) res = res * cur;
    return res;
  }
  void print() {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) cout << a[i][j] << " ";
      cout << endl;
    }
    cout << endl;
  }
};
int main() {
  cin >> n >> l, Acer.Init();
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) cin >> s, Acer.Insert(s, a[i]);
  Acer.BuildFail();
  Matrix G(Acer.cnt + 1, -(1LL << 60));
  for (int i = 0; i <= Acer.cnt; i++) G.a[i][i] = 0;
  for (int i = 0; i <= Acer.cnt; i++)
    for (int j = 0; j < 26; j++) G.a[i][Acer.t[i][j]] = Acer.val[Acer.t[i][j]];
  G = G ^ l;
  long long res = 0;
  for (int i = 0; i <= Acer.cnt; i++) res = max(res, G.a[0][i]);
  cout << res << endl;
  return 0;
}
