#include <bits/stdc++.h>
using namespace std;
int total = 1;
struct TborNode {
  int e[26];
  int suff_link;
  int curr_char;
  int parent;
  long long trulala;
  bool is_ok = false;
} bor_node[300];
void feed(string &s, int po) {
  int pos = 0;
  for (int i = 0; i < s.size(); i++) {
    int ps = s[i] - 'a';
    if (bor_node[pos].e[ps] == 0) {
      bor_node[pos].e[ps] = total;
      bor_node[total].curr_char = ps;
      bor_node[total].parent = pos;
      total++;
    }
    pos = bor_node[pos].e[ps];
  }
  bor_node[pos].trulala += po;
}
void make_it(int i) {
  bor_node[i].is_ok = true;
  int parent_slink = bor_node[bor_node[i].parent].suff_link;
  if (!bor_node[parent_slink].is_ok) make_it(parent_slink);
  int curr_slink = bor_node[parent_slink].e[bor_node[i].curr_char];
  if (i != curr_slink) bor_node[i].suff_link = curr_slink;
  if (!bor_node[bor_node[i].suff_link].is_ok) make_it(bor_node[i].suff_link);
  bor_node[i].trulala += bor_node[bor_node[i].suff_link].trulala;
  for (int j = 0; j < 26; j++)
    if (bor_node[i].e[j] == 0)
      bor_node[i].e[j] = bor_node[bor_node[i].suff_link].e[j];
}
void make_bor_like_automatus() {
  bor_node[0].is_ok = true;
  for (int i = 1; i < total; i++)
    if (!bor_node[i].is_ok) make_it(i);
}
long long b[300][300];
long long c[300][300];
long long t[300][300];
const long long inf = 1e18;
void make_matrix_from_that_weird_automatus() {
  for (int i = 0; i < total; i++)
    for (int j = 0; j < total; j++) b[i][j] = -inf;
  b[0][0] = 0;
  for (int i = 0; i < total; i++)
    for (int j = 0; j < 26; j++)
      b[i][bor_node[i].e[j]] = bor_node[bor_node[i].e[j]].trulala;
}
void pow_weird_matrix(long long n) {
  for (int i = 0; i < total; i++)
    for (int j = 0; j < total; j++) c[i][j] = 0;
  while (n) {
    if (n & 1) {
      for (int i = 0; i < total; i++)
        for (int j = 0; j < total; j++) {
          t[i][j] = -inf;
          for (int k = 0; k < total; k++)
            t[i][j] = max(t[i][j], b[i][k] + c[k][j]);
        }
      swap(t, c);
    }
    n >>= 1;
    for (int i = 0; i < total; i++)
      for (int j = 0; j < total; j++) {
        t[i][j] = -inf;
        for (int k = 0; k < total; k++)
          t[i][j] = max(t[i][j], b[i][k] + b[k][j]);
      }
    swap(t, b);
  }
}
int a[300];
int main() {
  int n;
  long long l;
  cin >> n >> l;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    feed(s, a[i]);
  }
  make_bor_like_automatus();
  make_matrix_from_that_weird_automatus();
  pow_weird_matrix(l);
  long long res = 0;
  for (int i = 0; i < total; i++) {
    if (c[0][i] > res) res = c[0][i];
  }
  cout << res << endl;
  return 0;
}
