#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long f = 1, sum = 0;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    sum = sum * 10 + c - '0';
    c = getchar();
  }
  return sum * f;
}
const int MAXN = 210;
struct Matrix {
  long long a[MAXN][MAXN];
};
Matrix mul(Matrix a, Matrix b) {
  Matrix ret;
  memset(ret.a, -1, sizeof(ret.a));
  for (int i = 1; i <= 201; i++)
    for (int j = 1; j <= 201; j++)
      for (int k = 1; k <= 201; k++)
        if (a.a[i][k] != -1 && b.a[k][j] != -1) {
          ret.a[i][j] = max(ret.a[i][j], a.a[i][k] + b.a[k][j]);
        }
  return ret;
}
Matrix quickpow(Matrix &a, long long b) {
  Matrix ret;
  memset(ret.a, -1, sizeof(ret.a));
  ret.a[1][1] = 0;
  while (b) {
    if (b & 1) {
      ret = mul(ret, a);
    }
    b /= 2, a = mul(a, a);
  }
  return ret;
}
queue<int> q;
int a[MAXN];
struct AC_Automation {
  int ch[MAXN][26], cnt, rt, fail[MAXN * 26], ed[MAXN * 26];
  void init() { cnt = rt = 1; }
  void new_node(int &x) {
    x = ++cnt;
    memset(ch[cnt], 0, sizeof(ch[cnt]));
    fail[cnt] = ed[cnt] = 0;
  }
  void insert(string s, int id) {
    int now = rt;
    for (int i = 0; i < s.size(); i++) {
      if (!ch[now][s[i] - 'a']) new_node(ch[now][s[i] - 'a']);
      now = ch[now][s[i] - 'a'];
    }
    ed[now] += a[id];
  }
  void build_fail() {
    for (int i = 0; i < 26; i++) {
      if (ch[rt][i])
        fail[ch[rt][i]] = rt, q.push(ch[rt][i]);
      else
        ch[rt][i] = rt;
    }
    while (!q.empty()) {
      int x = q.front();
      q.pop();
      ed[x] += ed[fail[x]];
      for (int i = 0; i < 26; i++) {
        if (ch[x][i])
          fail[ch[x][i]] = ch[fail[x]][i], q.push(ch[x][i]);
        else
          ch[x][i] = ch[fail[x]][i];
      }
    }
  }
  Matrix make_Matrix() {
    Matrix ret;
    memset(ret.a, -1, sizeof(ret.a));
    for (int i = 1; i <= cnt; i++)
      for (int j = 0; j < 26; j++) ret.a[i][ch[i][j]] = ed[ch[i][j]];
    return ret;
  }
} AC;
string s;
int main() {
  AC.init();
  int n = read();
  long long l = read();
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) {
    cin >> s;
    AC.insert(s, i);
  }
  AC.build_fail();
  Matrix ret = AC.make_Matrix();
  Matrix ret2 = quickpow(ret, l);
  long long ans = 0;
  for (int i = 1; i <= AC.cnt; i++) ans = max(ans, ret2.a[1][i]);
  cout << ans;
  return 0;
}
