#include <bits/stdc++.h>
using namespace std;
int costOnState[205];
int dfa[205][26];
bool cmp(string& a, string& b) {
  if (a.size() == b.size()) return a < b;
  return a.size() < b.size();
}
void mul(vector<vector<long long>> x, vector<vector<long long>> y,
         vector<vector<long long>>& z) {
  int r1 = x.size();
  int c1 = x[0].size();
  int r2 = y.size();
  int c2 = y[0].size();
  for (int i = 0; i < r1; i++)
    for (int j = 0; j < c2; j++)
      for (int k = 0; k < c1; k++) z[i][j] = max(z[i][j], x[i][k] + y[k][j]);
}
int n, a[205];
string str[205];
long long Len;
vector<string> Prefixs;
int main() {
  cin >> n >> Len;
  Prefixs.push_back("");
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < n; i++) {
    cin >> str[i];
    string tmp = "";
    for (auto c : str[i]) {
      tmp.push_back(c);
      Prefixs.push_back(tmp);
    }
  }
  sort(Prefixs.begin(), Prefixs.end(), cmp);
  Prefixs.resize(unique(Prefixs.begin(), Prefixs.end()) - Prefixs.begin());
  for (int i = 0; i < n; i++)
    for (int j = 0; j < Prefixs.size(); j++)
      if (Prefixs[j].size() >= str[i].size() &&
          Prefixs[j].substr(int(Prefixs[j].size() - str[i].size()),
                            str[i].size()) == str[i])
        costOnState[j] += a[i];
  for (int i = 0; i < Prefixs.size(); i++) {
    string u = Prefixs[i];
    for (char c = 'a'; c <= 'z'; c++) {
      u.push_back(c);
      for (int j = Prefixs.size() - 1; j >= 0; j--) {
        if (Prefixs[j].size() <= u.size() &&
            Prefixs[j] == u.substr(int(u.size() - Prefixs[j].size()),
                                   Prefixs[j].size())) {
          dfa[i][c - 'a'] = j;
          break;
        }
      }
      u.pop_back();
    }
  }
  vector<vector<long long>> ans = vector<vector<long long>>(
      Prefixs.size(), vector<long long>(Prefixs.size(), -1e18));
  vector<vector<long long>> b = ans;
  for (int i = 0; i < Prefixs.size(); i++) {
    for (int j = 0; j < 26; j++) b[i][dfa[i][j]] = costOnState[dfa[i][j]];
    ans[i][i] = 0;
  }
  for (; Len; Len >>= 1) {
    if (Len & 1) {
      mul(ans, b, ans);
    }
    mul(b, b, b);
  }
  cout << *max_element(ans[0].begin(), ans[0].end()) << '\n';
  return 0;
}
