#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
inline void gmax(T1 &a, T2 b) {
  if (b > a) a = b;
}
template <class T1, class T2>
inline void gmin(T1 &a, T2 b) {
  if (b < a) a = b;
}
const long long INF = 1ll << 60;
const int N = 202;
const int maxnode = 300;
const int sigma_size = 30;
int n, V[204], m;
char s[204];
long long l;
struct Trie {
  int ch[maxnode][sigma_size];
  int val[maxnode];
  int f[maxnode];
  int sz;
  void init() {
    sz = 1;
    memset(ch, 0, sizeof(ch));
    memset(val, 0, sizeof(val));
    memset(f, 0, sizeof(f));
  }
  int idx(char c) { return c - 'a'; }
  void insert(char *s, int id) {
    int u = 0;
    for (int i = 0; s[i]; i++) {
      int c = idx(s[i]);
      if (!ch[u][c]) ch[u][c] = sz++;
      u = ch[u][c];
    }
    val[u] += V[id];
  }
  void getFail() {
    queue<int> q;
    for (int i = 0; i < sigma_size; i++)
      if (ch[0][i]) q.push(ch[0][i]);
    while (!q.empty()) {
      int r = q.front();
      q.pop();
      for (int c = 0; c < sigma_size; c++) {
        int u = ch[r][c];
        if (!u) continue;
        q.push(u);
        int v = f[r];
        while (v && ch[v][c] == 0) v = f[v];
        f[u] = ch[v][c];
      }
    }
  }
} ac;
struct mat {
  long long a[205][205];
  mat() { memset(a, 0, sizeof(a)); }
  void E() {
    for (int i = 0; i < 202; ++i)
      for (int j = 0; j < 202; ++j)
        if (i == j)
          a[i][j] = 0;
        else
          a[i][j] = -INF;
  }
  mat operator*(mat B) {
    mat C;
    C.E();
    for (int i = 0; i < m; ++i)
      for (int j = 0; j < m; ++j)
        for (int k = 0; k < m; ++k) gmax(C.a[i][j], a[i][k] + B.a[k][j]);
    return C;
  }
  void show() {
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < m; ++j)
        if (a[i][j] == -INF)
          printf("  x");
        else
          printf("%3lld", a[i][j]);
      puts("");
    }
  }
} A;
mat Pow(mat A, long long n) {
  mat res;
  res.E();
  while (n) {
    if (n & 1) {
      res = res * A;
    }
    n >>= 1;
    A = A * A;
  }
  return res;
}
void solve() {
  ac.init();
  for (int i = 0; i < n; ++i) scanf("%d", &V[i]);
  for (int i = 0; i < n; ++i) {
    scanf("%s", s);
    ac.insert(s, i);
  }
  ac.getFail();
  m = ac.sz;
  A.E();
  for (int i = 0; i < ac.sz; ++i) {
    for (int j = 0; j < 26; ++j) {
      int tem = i, u;
      while (tem && ac.ch[tem][j] == 0) tem = ac.f[tem];
      u = tem = ac.ch[tem][j];
      long long t = 0;
      while (tem) {
        t += ac.val[tem];
        tem = ac.f[tem];
      }
      gmax(A.a[i][u], t);
    }
  }
  A = Pow(A, l);
  long long ans = 0;
  for (int i = 0; i < m; ++i) gmax(ans, A.a[0][i]);
  printf("%I64d\n", ans);
}
int main() {
  while (~scanf("%d%I64d", &n, &l)) solve();
  return 0;
}
