#include <bits/stdc++.h>
using namespace std;
int n, p, t[222][26], pt[222], w[222], q[222], l, h, f[222];
long long len, a[222][222], b[222][222], c[222][222], ans;
char s[222];
void mul(long long a[222][222], long long b[222][222]) {
  for (int i = (0); i <= (p); i++)
    for (int j = (0); j <= (p); j++) {
      c[i][j] = -1;
      for (int k = (0); k <= (p); k++)
        if (a[i][k] >= 0 && b[k][j] >= 0)
          c[i][j] = max(c[i][j], a[i][k] + b[k][j]);
    }
  for (int i = (0); i <= (p); i++)
    for (int j = (0); j <= (p); j++) a[i][j] = c[i][j];
}
int main() {
  scanf("%d %I64d", &n, &len);
  for (int i = (0); i < (n); i++) scanf("%d", &pt[i]);
  for (int i = (0); i < (n); i++) {
    scanf("%s", s);
    int r = 0;
    for (int j = 0; s[j]; j++) {
      if (!t[r][s[j] - 'a']) t[r][s[j] - 'a'] = ++p;
      r = t[r][s[j] - 'a'];
    }
    w[r] += pt[i];
  }
  q[h++] = 0;
  while (l < h) {
    int r = q[l++];
    w[r] += w[f[r]];
    for (int i = (0); i < (26); i++)
      if (t[r][i]) {
        int c = t[r][i];
        q[h++] = c;
        if (!r)
          f[c] = r;
        else {
          int p = f[r];
          while (p && !t[p][i]) p = f[p];
          f[c] = t[p][i];
        }
      }
  }
  for (int i = (0); i <= (p); i++)
    for (int j = (0); j <= (p); j++) a[i][j] = b[i][j] = -1;
  for (int i = (0); i <= (p); i++) a[i][i] = 0;
  for (int i = (0); i <= (p); i++) {
    for (int j = (0); j < (26); j++) {
      int r = i;
      while (r && !t[r][j]) r = f[r];
      b[i][t[r][j]] = w[t[r][j]];
    }
  }
  for (long long i = len; i; i >>= 1) {
    if (i & 1) mul(a, b);
    mul(b, b);
  }
  for (int i = (0); i <= (p); i++) ans = max(ans, a[0][i]);
  printf("%I64d\n", ans);
}
