#include <bits/stdc++.h>
using namespace std;
const int MN = 205;
const int Z = 26;
const long long NINF = -LLONG_MAX / 2;
struct matrix {
  int sz;
  long long d[MN][MN];
  matrix(int _size) { sz = _size; }
  matrix operator*(const matrix &I) const {
    matrix ans(sz);
    for (int i = 0; i < sz; i++)
      for (int j = 0; j < sz; j++) ans.d[i][j] = NINF;
    for (int i = 0; i < sz; i++) {
      for (int j = 0; j < sz; j++) {
        for (int k = 0; k < sz; k++) {
          ans.d[i][j] = max(ans.d[i][j], d[i][k] + I.d[k][j]);
        }
      }
    }
    return ans;
  }
};
matrix fastExp(matrix a, long long b) {
  b--;
  matrix t = a;
  matrix y = a;
  while (b) {
    if (b & 1) t = t * y;
    y = y * y;
    b >>= 1;
  }
  return t;
}
struct AcAutomaton {
 public:
  int nn, chd[MN][Z], fail[MN], val[MN], Q[MN];
  void init() {
    nn = 1;
    memset(chd[0], 0, sizeof(chd[0]));
  }
  void insert(char *s, int v) {
    int p = 0;
    while (*s) {
      int c = *s++ - 'a';
      if (!chd[p][c]) {
        memset(chd[nn], 0, sizeof(chd[nn]));
        chd[p][c] = nn++;
      }
      p = chd[p][c];
    }
    val[p] += v;
  }
  void build() {
    int *s = Q, *e = Q;
    for (int i = 0; i < Z; i++) {
      if (chd[0][i]) {
        *e++ = chd[0][i];
        fail[chd[0][i]] = 0;
      }
    }
    while (s != e) {
      int u = *s++;
      for (int i = 0; i < Z; i++) {
        int &v = chd[u][i];
        if (v) {
          *e++ = v;
          fail[v] = chd[fail[u]][i];
          val[v] += val[fail[v]];
        } else
          v = chd[fail[u]][i];
      }
    }
  }
  long long solve(long long L) {
    matrix M(nn);
    for (int i = 0; i < nn; i++)
      for (int j = 0; j < nn; j++) M.d[i][j] = NINF;
    for (int i = 0; i < nn; i++) {
      for (int j = 0; j < Z; j++) {
        if (chd[i][j]) {
          M.d[i][chd[i][j]] = val[chd[i][j]];
        }
      }
    }
    matrix A = fastExp(M, L);
    long long ans = 0;
    for (int i = 0; i < nn; i++) ans = max(ans, A.d[0][i]);
    return ans;
  }
} AC;
int main() {
  int n, a[MN];
  long long L;
  char buf[MN];
  scanf("%d%I64d", &n, &L);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  AC.init();
  for (int i = 0; i < n; i++) {
    scanf("%s", buf);
    AC.insert(buf, a[i]);
  }
  AC.build();
  printf("%I64d\n", AC.solve(L));
  return 0;
}
