#include <bits/stdc++.h>
using namespace std;
const int Maxn = 210;
int m, tot;
long long val[Maxn], n;
long long ans;
int w[Maxn], c[Maxn][30], fail[Maxn];
char str[Maxn];
void insert(int now) {
  int p = 0;
  for (int i = 0; str[i]; i++) {
    int idx = str[i] - 'a';
    if (!c[p][idx]) {
      c[p][idx] = ++tot;
    }
    p = c[p][idx];
  }
  val[p] += w[now];
}
queue<int> q;
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 matrix[Maxn][Maxn];
  Matrix() { memset(matrix, -1, sizeof(matrix)); }
  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.matrix[i][k]) {
          for (int j = 0; j <= tot; j++) {
            if (~b.matrix[k][j]) {
              c.matrix[i][j] =
                  max(c.matrix[i][j], a.matrix[i][k] + b.matrix[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", str);
    insert(i);
  }
  bfs();
  for (int i = 0; i <= tot; i++) {
    for (int p = 0; p < 26; p++) {
      a.matrix[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.matrix[0][i]);
  }
  printf("%lld\n", ans);
  return 0;
}
