#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
typedef long long Matr[MAXN][MAXN];
int go[MAXN][26];
int n;
vector<string> a;
int kv;
vector<int> add;
vector<int> cost;
vector<string> str;
bool endswith(string a, string b) {
  return a.size() >= b.size() && a.substr(a.size() - b.size()) == b;
}
void dfs(int v, string s) {
  str[v] = s;
  for (int i = 0; i < (int)(n); i++) {
    if (endswith(s, a[i])) {
      add[v] += cost[i];
    }
  }
  for (int c = 0; c < (int)(26); c++) {
    if (go[v][c] != -1) {
      string t = s + char('a' + c);
      dfs(go[v][c], t);
    }
  }
}
void mult(Matr& a, Matr& b, Matr& c) {
  for (int i = 0; i < (int)(kv); i++) {
    for (int j = 0; j < (int)(kv); j++) {
      c[i][j] = -1;
      for (int k = 0; k < (int)(kv); k++) {
        if (a[i][k] != -1 && b[k][j] != -1)
          c[i][j] = max(c[i][j], a[i][k] + b[k][j]);
      }
    }
  }
}
void getPow(Matr& a, long long b, Matr& res) {
  for (int i = 0; i < (int)(kv); i++) {
    for (int j = 0; j < (int)(kv); j++) {
      res[i][j] = -1;
      if (i == j) res[i][j] = 0;
    }
  }
  Matr cur;
  Matr t;
  memcpy(cur, a, sizeof(Matr));
  for (int i = 0; i < (int)(50); i++) {
    if (b < (1ll << i)) break;
    if (b & (1ll << i)) {
      memcpy(t, res, sizeof(Matr));
      mult(t, cur, res);
    }
    memcpy(t, cur, sizeof(Matr));
    mult(t, t, cur);
  }
}
int main() {
  memset(go, 255, sizeof(go));
  long long len;
  cin >> n >> len;
  cost = vector<int>(n);
  for (int i = 0; i < (int)(n); i++) cin >> cost[i];
  kv = 1;
  a = vector<string>(n);
  for (int i = 0; i < (int)(n); i++) {
    cin >> a[i];
    int v = 0;
    for (char c : a[i]) {
      if (go[v][c - 'a'] == -1) {
        go[v][c - 'a'] = kv++;
      }
      v = go[v][c - 'a'];
    }
  }
  add = vector<int>(kv);
  str = vector<string>(kv);
  dfs(0, "");
  Matr d;
  memset(d, 255, sizeof(d));
  for (int i = 0; i < (int)(kv); i++) {
    string s = str[i];
    for (char c = 'a'; c <= 'z'; c++) {
      string t = s;
      t += c;
      int id = 0;
      for (int j = 0; j < (int)(kv); j++) {
        if (endswith(t, str[j]) && str[id].size() < str[j].size()) {
          id = j;
        }
      }
      d[i][id] = max(d[i][id], (long long)add[id]);
    }
  }
  Matr dp;
  getPow(d, len, dp);
  long long ans = 0;
  for (int i = 0; i < (int)(kv); i++) {
    ans = max(ans, dp[0][i]);
  }
  cout << ans << endl;
  return 0;
}
