#include <bits/stdc++.h>
using namespace std;
int n, sz, a[205], f[205], trie[205][30];
long long m;
vector<int> ac[205];
char s[205];
struct matrix {
  int n, m;
  long long a[205][205];
  matrix(int n_, int m_) {
    n = n_, m = m_;
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= m; j++) a[i][j] = -1;
  }
  matrix operator*(const matrix &t) {
    int p = t.m;
    matrix res(n, p);
    for (int i = 0; i <= n; i++) {
      for (int j = 0; j <= p; j++) {
        for (int k = 0; k <= m; k++) {
          if (a[i][k] == -1 || t.a[k][j] == -1) continue;
          res.a[i][j] = max(res.a[i][j], a[i][k] + t.a[k][j]);
        }
      }
    }
    return res;
  }
};
matrix exp(matrix t, long long b) {
  if (b == 1) return t;
  if (b % 2) return t * exp(t, b - 1);
  matrix sq = exp(t, b / 2);
  return sq * sq;
}
void buildAC() {
  queue<int> q;
  for (int i = 0; i < 26; i++) {
    if (trie[0][i] == -1)
      trie[0][i] = 0;
    else
      q.push(trie[0][i]);
  }
  while (!q.empty()) {
    int p = q.front();
    q.pop();
    for (int c = 0; c < 26; c++) {
      if (trie[p][c] == -1) continue;
      int k = f[p];
      while (k > 0 && trie[k][c] == -1) k = f[k];
      k = trie[k][c];
      f[trie[p][c]] = k;
      for (int o : ac[k]) ac[trie[p][c]].push_back(o);
      q.push(trie[p][c]);
    }
  }
}
int dp[100][100];
int F(int i, int p) {
  if (i == m + 1) return 0;
  if (dp[i][p] != -1) return dp[i][p];
  int sol = 0;
  for (int c = 0; c < 26; c++) {
    int k = p;
    while (k > 0 && trie[k][c] == -1) k = f[k];
    k = trie[k][c];
    int cost = 0;
    for (int o : ac[k]) cost += a[o];
    sol = max(sol, F(i + 1, k) + cost);
    if (cost > 0) printf("%d %d : %d\n", p, k, cost);
  }
  return dp[i][p] = sol;
}
int main() {
  scanf("%d%I64d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  memset(trie, -1, sizeof(trie));
  for (int i = 1; i <= n; i++) {
    scanf("%s", s);
    int l = strlen(s);
    int k = 0;
    for (int j = 0; j < l; j++) {
      int c = s[j] - 'a';
      if (trie[k][c] == -1) trie[k][c] = ++sz;
      k = trie[k][c];
    }
    ac[k].push_back(i);
  }
  buildAC();
  matrix s(sz, sz);
  for (int i = 0; i <= sz; i++) {
    for (int c = 0; c < 26; c++) {
      int k = i;
      while (k > 0 && trie[k][c] == -1) k = f[k];
      k = trie[k][c];
      if (s.a[i][k] == -1) s.a[i][k] = 0;
      for (int id : ac[k]) {
        s.a[i][k] += a[id];
      }
    }
  }
  s = exp(s, m);
  long long sol = 0;
  for (int i = 0; i <= sz; i++) {
    sol = max(sol, s.a[0][i]);
  }
  memset(dp, -1, sizeof(dp));
  printf("%I64d\n", sol);
  return 0;
}
