#include <bits/stdc++.h>
using namespace std;
const long long p = 10000000000;
int n;
long long l;
struct Matrix {
  long long M[222][222], n;
  Matrix() {}
  Matrix(int _n, long long x) {
    n = _n;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) M[i][j] = x;
  }
  Matrix operator*(const Matrix &a) const {
    Matrix ret = Matrix(n, -1);
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        for (int k = 0; k < n; k++)
          ret.M[i][j] = max(ret.M[i][j], ((a.M[i][k] != -1 && M[k][j] != -1)
                                              ? a.M[i][k] + M[k][j]
                                              : -0x3f3f3f3f));
    return ret;
  }
};
Matrix pow_Matrix(Matrix a, long long x) {
  Matrix ret = Matrix(a.n, 0);
  while (x) {
    if (x & 1) ret = ret * a;
    a = a * a;
    x >>= 1;
  }
  return ret;
}
char s[1000 + 10];
struct AC_trie {
  int root, cnt;
  int End[5000 + 10], to[5000 + 10][27], fail[5000 + 10];
  int newnode() {
    for (int i = 0; i < 26; i++) to[cnt][i] = -1;
    End[cnt] = 0;
    return cnt++;
  }
  void init() {
    cnt = 0;
    root = newnode();
  }
  void insert(char *s, int w) {
    int now = root;
    for (char *ss = s; *ss; ss++) {
      int v = *ss - 'a';
      if (to[now][v] == -1) to[now][v] = newnode();
      now = to[now][v];
    }
    End[now] += w;
  }
  void build() {
    queue<int> my;
    fail[root] = root;
    for (int i = 0; i < 26; i++)
      if (to[root][i] == -1)
        to[root][i] = root;
      else {
        fail[to[root][i]] = root;
        my.push(to[root][i]);
      }
    while (!my.empty()) {
      int u = my.front();
      End[u] += End[fail[u]];
      my.pop();
      for (int i = 0; i < 26; i++) {
        int v = to[u][i];
        if (v != -1) {
          fail[v] = to[fail[u]][i];
          my.push(v);
        } else
          to[u][i] = to[fail[u]][i];
      }
    }
  }
  Matrix Matrix_build() {
    Matrix a = Matrix(cnt, -1);
    for (int i = 0; i < cnt; i++)
      for (int j = 0; j < 26; j++) a.M[i][to[i][j]] = End[to[i][j]];
    return a;
  }
} AC;
int val[222];
int main() {
  while (~scanf("%d%I64d", &n, &l)) {
    AC.init();
    for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
    for (int i = 1; i <= n; i++) {
      scanf("%s", s);
      AC.insert(s, val[i]);
    }
    AC.build();
    Matrix a = AC.Matrix_build();
    Matrix b = pow_Matrix(a, l);
    long long ans = 0;
    for (int i = 0; i < AC.cnt; i++) ans = max(ans, b.M[0][i]);
    printf("%I64d\n", ans);
  }
  return 0;
}
