#include <bits/stdc++.h>
using namespace std;
int n;
long long Len;
int w[205];
char data[205];
int tot, ch[205][26], val[205];
void insert(char *s, int _w) {
  int r = 0, d, len = strlen(s);
  for (int i = 0; i < len; i++) {
    d = s[i] - 'a';
    if (!ch[r][d]) ch[r][d] = ++tot;
    r = ch[r][d];
  }
  val[r] += _w;
}
int fail[205];
void build() {
  queue<int> q;
  for (int i = 0; i < 26; i++)
    if (ch[0][i]) q.push(ch[0][i]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < 26; i++) {
      int v = ch[u][i];
      if (!v)
        ch[u][i] = ch[fail[u]][i];
      else {
        fail[v] = ch[fail[u]][i];
        val[v] += val[fail[v]];
        q.push(v);
      }
    }
  }
}
long long f[205], a[205][205], t[205][205];
void mul_self() {
  for (int i = 0; i <= tot; i++)
    for (int j = 0; j <= tot; j++) t[i][j] = -(1ll << 60);
  for (int i = 0; i <= tot; i++)
    for (int j = 0; j <= tot; j++)
      for (int k = 0; k <= tot; k++) t[i][j] = max(t[i][j], a[i][k] + a[k][j]);
  for (int i = 0; i <= tot; i++)
    for (int j = 0; j <= tot; j++) a[i][j] = t[i][j];
}
void mul() {
  for (int i = 0; i <= tot; i++) t[0][i] = -(1ll << 60);
  for (int j = 0; j <= tot; j++)
    for (int k = 0; k <= tot; k++) t[0][j] = max(t[0][j], f[k] + a[k][j]);
  for (int i = 0; i <= tot; i++) f[i] = t[0][i];
}
int main() {
  scanf("%d%lld", &n, &Len);
  for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
  for (int i = 1; i <= n; i++) {
    scanf("%s", data);
    insert(data, w[i]);
  }
  build();
  for (int i = 0; i <= tot; i++)
    for (int j = 0; j <= tot; j++) a[i][j] = -(1ll << 60);
  for (int i = 0; i <= tot; i++) {
    f[i] = -(1ll << 60);
    for (int j = 0; j < 26; j++) a[i][ch[i][j]] = val[ch[i][j]];
  }
  f[0] = 0;
  for (; Len; mul_self(), Len >>= 1)
    if (Len & 1) mul();
  long long ans = 0;
  for (int i = 0; i <= tot; i++) ans = max(ans, f[i]);
  printf("%lld\n", ans);
  return 0;
}
