#include <bits/stdc++.h>
using namespace std;
const long long N = 210;
struct matrix {
  long long A[N][N];
  matrix() { memset(A, 0xcf, sizeof(A)); }
} G, dp;
long long n;
long long m;
long long a[N], sum[N], ans;
long long ch[N][26], fail[N], tot = 1;
char s[N];
queue<long long> q;
matrix Mul(matrix X, matrix Y) {
  matrix Z;
  for (long long i = 1; i <= tot; i++) {
    for (long long j = 1; j <= tot; j++) {
      for (long long k = 1; k <= tot; k++) {
        Z.A[i][j] = max(Z.A[i][j], X.A[i][k] + Y.A[k][j]);
      }
    }
  }
  return Z;
}
matrix ksm(matrix X, long long y) {
  matrix Z;
  for (long long i = 1; i <= tot; i++) Z.A[i][i] = 0;
  while (y) {
    if (y & 1) Z = Mul(Z, X);
    X = Mul(X, X);
    y >>= 1;
  }
  return Z;
}
int 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);
    long long p = 1;
    long long len = strlen(s + 1);
    for (long long j = 1; j <= len; j++) {
      if (!ch[p][s[j] - 'a']) ch[p][s[j] - 'a'] = ++tot;
      p = ch[p][s[j] - 'a'];
    }
    sum[p] += a[i];
  }
  for (long long i = 0; i < 26; i++) ch[0][i] = 1;
  fail[1] = 0;
  q.push(1);
  while (!q.empty()) {
    long long p = q.front();
    q.pop();
    sum[p] += sum[fail[p]];
    for (long long i = 0; i < 26; i++) {
      if (ch[p][i]) {
        fail[ch[p][i]] = ch[fail[p]][i];
        q.push(ch[p][i]);
      } else {
        ch[p][i] = ch[fail[p]][i];
      }
    }
  }
  for (long long i = 1; i <= tot; i++) {
    for (long long c = 0; c < 26; c++) {
      long long j = ch[i][c];
      G.A[i][j] = sum[j];
    }
  }
  G = ksm(G, m);
  dp.A[1][1] = 0;
  dp = Mul(dp, G);
  for (long long i = 1; i <= tot; i++) ans = max(ans, dp.A[1][i]);
  cout << ans;
  return 0;
}
