#include <bits/stdc++.h>
using namespace std;
const long long N = 210, M = 27;
long long n, m, a[N], tot = 1, ch[N][M], fail[N], cnt[N], c[N][N], f[N][N],
                      res[N][N], ans;
char s[N];
void insert(char* s, long long id) {
  long long len = strlen(s + 1), p = 1;
  for (long long i = 1; i <= len; i++) {
    long long k = s[i] - 'a';
    if (!ch[p][k]) ch[p][k] = ++tot;
    p = ch[p][k];
  }
  cnt[p] += a[id];
}
void getfail() {
  queue<long long> q;
  for (long long i = 0; i < 26; i++) ch[0][i] = 1;
  q.push(1), fail[1] = 0;
  while (q.size()) {
    long long x = q.front();
    q.pop();
    cnt[x] += cnt[fail[x]];
    for (long long i = 0; i < 26; i++) {
      long long k = ch[x][i];
      if (k)
        fail[k] = ch[fail[x]][i], q.push(k);
      else
        ch[x][i] = ch[fail[x]][i];
    }
  }
}
void mul(long long a[N][N], long long b[N][N]) {
  memset(c, -0x3f, sizeof(c));
  for (long long i = 1; i <= tot; i++)
    for (long long j = 1; j <= tot; j++)
      for (long long k = 1; k <= tot; k++)
        c[i][j] = max(c[i][j], a[i][k] + b[k][j]);
  memcpy(a, c, sizeof(c));
}
signed main() {
  scanf("%lld%lld", &n, &m);
  for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (long long i = 1; i <= n; i++) scanf("%s", s + 1), insert(s, i);
  getfail();
  memset(f, -0x3f, sizeof(f));
  for (long long i = 1; i <= tot; i++)
    for (long long j = 0; j <= 26; j++) f[i][ch[i][j]] = cnt[ch[i][j]];
  memset(res, -0x3f, sizeof(res)), res[1][1] = 0;
  for (; m; m >>= 1, mul(f, f))
    if (m & 1) mul(res, f);
  for (long long i = 1; i <= tot; i++) ans = max(ans, res[1][i]);
  printf("%lld\n", ans);
  return 0;
}
