#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 210;
class Trie {
 public:
  Trie() { cnt = 1; }
  int cnt;
  int trie[maxn][26];
  int fail[maxn];
  int val[maxn];
  void insert(string s, int v) {
    int len = s.size();
    int pos = 0;
    for (int i = 0; i < len; i++) {
      int next = s[i] - 'a';
      if (!trie[pos][next]) trie[pos][next] = cnt++;
      pos = trie[pos][next];
    }
    val[pos] += v;
  }
  void getfail() {
    queue<int> q;
    for (int i = 0; i < 26; i++) {
      if (trie[0][i]) {
        fail[trie[0][i]] = 0;
        q.push(trie[0][i]);
      }
    }
    while (!q.empty()) {
      int pos = q.front();
      val[pos] += val[fail[pos]];
      q.pop();
      for (int i = 0; i < 26; i++) {
        if (trie[pos][i]) {
          fail[trie[pos][i]] = trie[fail[pos]][i];
          q.push(trie[pos][i]);
        } else {
          trie[pos][i] = trie[fail[pos]][i];
        }
      }
    }
  }
} ac;
int val[maxn];
class matrix {
 public:
  long long mat[maxn][maxn];
  int row, column;
  friend matrix operator*(matrix s1, matrix s2) {
    matrix s3;
    for (int i = 0; i < s1.row; i++) {
      for (int j = 0; j < s2.column; j++) {
        s3.mat[i][j] = -inf;
        for (int k = 0; k < s1.column; k++) {
          if (s1.mat[i][k] != -inf && s2.mat[k][j] != -inf)
            s3.mat[i][j] = max(s3.mat[i][j], s1.mat[i][k] + s2.mat[k][j]);
        }
      }
    }
    s3.row = s1.row;
    s3.column = s2.column;
    return s3;
  }
} e;
matrix quick_pow(matrix s1, long long n) {
  matrix mul = s1, ans;
  ans = s1;
  n--;
  for (; n; mul = mul * mul, n >>= 1) {
    if (n & 1) ans = ans * mul;
  }
  return ans;
}
void init() {
  e.row = e.column = ac.cnt;
  for (int i = 0; i < ac.cnt; i++)
    for (int j = 0; j < ac.cnt; j++) e.mat[i][j] = -inf;
  for (int i = 0; i < ac.cnt; i++)
    for (int j = 0; j < 26; j++)
      e.mat[i][ac.trie[i][j]] =
          max(e.mat[i][ac.trie[i][j]], (long long)ac.val[ac.trie[i][j]]);
}
string s;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  long long l;
  cin >> n >> l;
  for (int i = 0; i < n; i++) cin >> val[i];
  for (int i = 0; i < n; i++) {
    cin >> s;
    ac.insert(s, val[i]);
  }
  ac.getfail();
  init();
  e = quick_pow(e, l);
  long long ans = 0;
  for (int i = 0; i < ac.cnt; i++) ans = max(ans, e.mat[0][i]);
  cout << ans << "\n";
  return 0;
}
