#include <bits/stdc++.h>
using namespace std;
const int maxn = 205;
char ss[maxn];
int m, tot;
long long val[maxn], ans, n;
int w[maxn], c[maxn][30], fail[maxn];
inline void insert(int nw) {
  int p = 0;
  for (int i = 0; ss[i]; i++) {
    int idx = ss[i] - 'a';
    if (!c[p][idx]) c[p][idx] = ++tot;
    p = c[p][idx];
  }
  val[p] += w[nw];
}
queue<int> q;
inline void bfs() {
  for (int i = 0; i < 26; i++) {
    if (c[0][i]) q.push(c[0][i]);
  }
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < 26; i++) {
      int &v = c[u][i];
      if (!v) {
        v = c[fail[u]][i];
        continue;
      }
      fail[v] = c[fail[u]][i];
      val[v] += val[fail[v]];
      q.push(v);
    }
  }
}
struct Matrix {
  long long mat[maxn][maxn];
  Matrix() { memset(mat, -1, sizeof(mat)); }
  inline friend Matrix operator*(const Matrix &a, const Matrix &b) {
    Matrix c;
    for (int k = 0; k <= tot; k++) {
      for (int i = 0; i <= tot; i++) {
        if (~a.mat[i][k])
          for (int j = 0; j <= tot; j++) {
            if (~b.mat[k][j])
              c.mat[i][j] = max(c.mat[i][j], a.mat[i][k] + b.mat[k][j]);
          }
      }
    }
    return c;
  }
} a, ret;
int main() {
  scanf("%d%lld", &m, &n);
  for (int i = 0; i < m; i++) scanf("%d", &w[i]);
  for (int i = 0; i < m; i++) {
    scanf("%s", ss);
    insert(i);
  }
  bfs();
  for (int i = 0; i <= tot; i++) {
    for (int p = 0; p < 26; p++) a.mat[i][c[i][p]] = val[c[i][p]];
  }
  ret = a;
  n--;
  while (n) {
    if (n & 1) ret = ret * a;
    a = a * a;
    n >>= 1;
  }
  for (int i = 0; i <= tot; i++) {
    ans = max(ans, ret.mat[0][i]);
  }
  printf("%lld\n", ans);
}
