#include <bits/stdc++.h>
using namespace std;
int n;
long long l;
char s[222];
int b[222];
long long v[222];
int cnt = 1;
long long vet[222];
int trie[222][27];
long long resp;
struct mat {
  int m;
  long long v[222][222];
  mat() {
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < m; ++j) v[i][j] = -0x3F3F3F3F3F3F3F3FLL;
  }
  mat(int m) : m(m) {
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < m; ++j) v[i][j] = -0x3F3F3F3F3F3F3F3FLL;
  }
  void ident() {
    for (int i = 0; i < m; ++i) v[i][i] = 0;
  }
  mat operator*(mat t) {
    mat r(m);
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < m; ++j)
        for (int k = 0; k < m; ++k)
          r.v[i][j] = max(r.v[i][j], v[i][k] + t.v[k][j]);
    return r;
  }
};
void add(int p) {
  int len = strlen(s), x = 0;
  for (int i = 0; i < len; ++i) {
    char c = s[i] - 'a';
    if (!trie[x][c]) trie[x][c] = cnt++;
    x = trie[x][c];
  }
  v[x] += vet[p];
}
void aho() {
  queue<int> q;
  q.push(0);
  int x, u;
  while (!q.empty()) {
    x = q.front();
    q.pop();
    u = b[x];
    v[x] += v[u];
    for (int i = 0; i < 26; ++i) {
      if (trie[x][i]) {
        b[trie[x][i]] = x ? trie[u][i] : 0;
        q.push(trie[x][i]);
      } else {
        trie[x][i] = trie[u][i];
      }
    }
  }
}
int main() {
  scanf("%d %lld", &n, &l);
  for (int i = 0; i < n; ++i) {
    scanf("%lld", &vet[i]);
  }
  for (int i = 0; i < n; ++i) {
    scanf("%s", s);
    add(i);
  }
  aho();
  mat aux(cnt), ans(cnt);
  ans.ident();
  for (int i = 0; i < cnt; ++i)
    for (int j = 0; j < 26; ++j)
      aux.v[i][trie[i][j]] = max(aux.v[i][trie[i][j]], v[trie[i][j]]);
  for (int i = 0; i < cnt; ++i) aux.v[i][0] = 0;
  while (l > 0) {
    if (l & 1) ans = ans * aux;
    aux = aux * aux;
    l /= 2;
  }
  for (int i = 0; i < cnt; ++i) resp = max(resp, ans.v[0][i]);
  printf("%lld\n", resp);
  return 0;
}
