#include <bits/stdc++.h>
using namespace std;
const int maxn = 210;
struct {
  int bonus;
  int p;
  int next[26];
} trie[maxn];
int trie_k = 0;
int trie_new() {
  assert(trie_k < maxn);
  trie[trie_k].bonus = 0;
  trie[trie_k].p = -1;
  for (int i = 0; i < 26; i++) trie[trie_k].next[i] = -1;
  return trie_k++;
}
int main() {
  int n;
  long long l;
  cin >> n >> l;
  int a[n];
  for (int i = 0; i < n; i++) cin >> a[i];
  int root = trie_new();
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    int v = root;
    for (int j = 0; j < (int)s.length(); j++) {
      int x = s[j] - 'a';
      if (trie[v].next[x] == -1) trie[v].next[x] = trie_new();
      v = trie[v].next[x];
    }
    trie[v].bonus += a[i];
  }
  queue<int> q;
  for (int i = 0; i < 26; i++) {
    if (trie[root].next[i] == -1)
      trie[root].next[i] = root;
    else {
      trie[trie[root].next[i]].p = root;
      q.push(trie[root].next[i]);
    }
  }
  while (q.size()) {
    int u = q.front();
    q.pop();
    trie[u].bonus += trie[trie[u].p].bonus;
    for (int i = 0; i < 26; i++) {
      int &x = trie[u].next[i];
      if (x == -1)
        x = trie[trie[u].p].next[i];
      else {
        trie[x].p = trie[trie[u].p].next[i];
        q.push(x);
      }
    }
  }
  int m = trie_k;
  long long d[m][m];
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) d[i][j] = -1;
    for (int j = 0; j < 26; j++) {
      long long &x = d[i][trie[i].next[j]];
      if (x == -1) x = 0;
      x += trie[trie[i].next[j]].bonus;
    }
  }
  long long x[m][m], r[m][m];
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) {
      x[i][j] = d[i][j];
      r[i][j] = i == j ? 0 : -1;
    }
  for (long long p = l; p > 0; p >>= 1) {
    long long t[m][m];
    if (p & 1) {
      for (int i = 0; i < m; i++)
        for (int j = 0; j < m; j++) {
          t[i][j] = -1;
          for (int k = 0; k < m; k++)
            t[i][j] = max(t[i][j], (((r[i][k]) == -1 || (x[k][j]) == -1)
                                        ? -1
                                        : ((r[i][k]) + (x[k][j]))));
        }
      for (int i = 0; i < m; i++)
        for (int j = 0; j < m; j++) r[i][j] = t[i][j];
    }
    for (int i = 0; i < m; i++)
      for (int j = 0; j < m; j++) {
        t[i][j] = -1;
        for (int k = 0; k < m; k++)
          t[i][j] = max(t[i][j], (((x[i][k]) == -1 || (x[k][j]) == -1)
                                      ? -1
                                      : ((x[i][k]) + (x[k][j]))));
      }
    for (int i = 0; i < m; i++)
      for (int j = 0; j < m; j++) x[i][j] = t[i][j];
  }
  long long ans = -1;
  for (int i = 0; i < m; i++) ans = max(ans, r[root][i]);
  cout << ans << endl;
  return 0;
}
