#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
int N, M;
long long L;
long long A[MAXN];
string S[MAXN];
map<string, long long> score;
map<string, int> prefix;
string idx[MAXN];
long long P[MAXN];
long long mat[MAXN][MAXN];
long long temp[MAXN][MAXN];
long long dp[MAXN];
long long temp2[MAXN];
void mult() {
  memcpy(temp, mat, sizeof(temp));
  for (int i = 1; i <= M; i++)
    for (int j = 1; j <= M; j++)
      for (int k = 1; k <= M; k++)
        mat[i][j] = max(mat[i][j], temp[i][k] + temp[k][j]);
}
void mult2() {
  memcpy(temp2, dp, sizeof(dp));
  for (int i = 1; i <= M; i++)
    for (int j = 1; j <= M; j++) dp[i] = max(dp[i], mat[i][j] + temp2[j]);
}
int longest(string s) {
  for (int i = 0; i < s.size(); i++) {
    string t = s.substr(i, s.size() - i);
    if (prefix.count(t)) return prefix[t];
  }
  return prefix[""];
}
int main() {
  ios::sync_with_stdio(0);
  cin >> N >> L;
  for (int i = 1; i <= N; i++) cin >> A[i];
  for (int i = 1; i <= N; i++) {
    cin >> S[i];
    for (int j = 1; j <= S[i].size(); j++) prefix[S[i].substr(0, j)] = 1;
    score[S[i]] += A[i];
  }
  M = 0;
  prefix[""] = 1;
  for (map<string, int>::iterator it = prefix.begin(); it != prefix.end(); it++)
    it->second = ++M;
  for (map<string, int>::iterator it = prefix.begin(); it != prefix.end();
       it++) {
    string s = it->first;
    int i = it->second;
    idx[i] = s;
    for (int j = 0; j < s.size(); j++) {
      string cur = s.substr(j, s.size() - j);
      if (score.count(cur)) P[i] += score[cur];
    }
  }
  for (int i = 1; i <= M; i++)
    for (int j = 1; j <= M; j++) mat[i][j] = -(1LL << 60);
  for (int i = 1; i <= M; i++)
    for (char c = 'a'; c <= 'z'; c++) {
      string s = idx[i];
      s += c;
      int j = longest(s);
      mat[j][i] = P[j];
    }
  memset(dp, -1, sizeof(dp));
  dp[1] = 0;
  for (int i = 1; i < MAXN && L > 0; i++, L--) {
    memcpy(temp2, dp, sizeof(dp));
    for (int j = 1; j <= M; j++)
      if (idx[j].size() <= i)
        for (int k = 1; k <= M; k++)
          if (temp2[k] != -1 && mat[j][k] != -(1LL << 60))
            dp[j] = max(dp[j], mat[j][k] + temp2[k]);
  }
  for (; L > 0; L >>= 1) {
    if (L & 1) mult2();
    mult();
  }
  long long best = 0;
  for (int i = 1; i <= M; i++) best = max(best, dp[i]);
  cout << best << "\n";
  return 0;
}
