#include <bits/stdc++.h>
using namespace std;
const int maxn = 210;
const int maxs = 26;
int sz, ch[maxn][maxs], val[maxn], f[maxn];
void init() {
  memset(ch[0], 0, sizeof(ch[0]));
  sz = 1;
}
void insert(char *s, int v) {
  int u = 0, n = strlen(s);
  for (int i = 0; i < n; i++) {
    int c = s[i] - 'a';
    if (!ch[u][c]) {
      ch[u][c] = sz++;
    }
    u = ch[u][c];
  }
  val[u] += v;
}
void getFail() {
  queue<int> q;
  f[0] = 0;
  for (int c = 0; c < maxs; c++) {
    int u = ch[0][c];
    if (u) {
      f[u] = 0;
      q.push(u);
    }
  }
  while (!q.empty()) {
    int r = q.front();
    q.pop();
    if (f[r] != r) val[r] += val[f[r]];
    for (int c = 0; c < maxs; c++) {
      int u = ch[r][c], v = f[r];
      if (!u) {
        ch[r][c] = ch[v][c];
      } else {
        q.push(u);
        if (r) f[u] = ch[v][c];
      }
    }
  }
}
struct Matrix {
  int n;
  long long a[maxn][maxn];
  Matrix(int _n = 0) {
    n = _n;
    memset(a, -1, sizeof(a));
  }
  Matrix operator*(const Matrix &b) const {
    Matrix res(n);
    for (int k = 0; k < n; k++) {
      for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
          if (~a[i][k] && ~b.a[k][j]) {
            res.a[i][j] = max(res.a[i][j], a[i][k] + b.a[k][j]);
          }
        }
    }
    return res;
  }
};
int n, a[maxn];
long long l;
char s[maxn];
Matrix x, y;
int main() {
  cin >> n >> l;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  init();
  for (int i = 0; i < n; i++) {
    cin >> s;
    insert(s, a[i]);
  }
  getFail();
  x = Matrix(sz);
  for (int i = 0; i < sz; i++) {
    for (int j = 0; j < maxs; j++) {
      x.a[i][ch[i][j]] = val[ch[i][j]];
    }
  }
  y = Matrix(sz);
  for (int i = 0; i < sz; i++) y.a[i][0] = 0;
  while (l) {
    if (l & 1) y = x * y;
    x = x * x;
    l >>= 1;
  }
  long long res = 0;
  for (int i = 0; i < sz; i++) {
    res = max(res, y.a[0][i]);
  }
  cout << res << endl;
  return 0;
}
