#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
inline int read() {
  int X = 0, w = 0;
  char ch = 0;
  while (!isdigit(ch)) {
    w |= ch == '-';
    ch = getchar();
  }
  while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
  return w ? -X : X;
}
int lim;
struct matrix {
  long long dat[205][205];
  matrix(int r = 205) {
    for (int i = 0; i < r; i++) {
      for (int j = 0; j < r; j++) {
        dat[i][j] = -1e9;
      }
    }
  }
} E;
matrix operator*(const matrix& dat, const matrix& b) {
  matrix res;
  for (int i = 0; i < lim; i++) {
    for (int j = 0; j < lim; j++) {
      for (int h = 0; h < lim; h++) {
        res.dat[i][j] = max(res.dat[i][j], dat.dat[i][h] + b.dat[h][j]);
      }
    }
  }
  return res;
}
matrix power(matrix x, long long y) {
  matrix res = E;
  while (y) {
    if (y & 1) res = res * x;
    x = x * x, y >>= 1;
  }
  return res;
}
int ch[205][27];
int val[200005];
int fail[200005];
struct Aho_Corasick {
  int sz;
  Aho_Corasick() {
    memset(ch[0], 0, sizeof(ch[0]));
    sz = 1;
  }
  int idx(char c) { return c - 'a'; }
  void insert(char* pat, int len, int key) {
    int x = 0;
    for (int i = 0; i < len; i++) {
      int c = idx(pat[i]);
      if (ch[x][c] == 0) {
        memset(ch[sz], 0, sizeof(ch[sz]));
        val[sz] = 0;
        ch[x][c] = sz++;
      }
      x = ch[x][c];
    }
    val[x] += key;
  }
  void getfail() {
    queue<int> q;
    fail[0] = 0;
    for (int c = 0; c < 26; c++) {
      int x = ch[0][c];
      if (x == 0) {
        continue;
      }
      fail[x] = 0;
      q.push(x);
    }
    while (!q.empty()) {
      int r = q.front();
      q.pop();
      val[r] += val[fail[r]];
      for (int c = 0; c < 26; c++) {
        int x = ch[r][c];
        int v = fail[r];
        if (x == 0) {
          ch[r][c] = ch[v][c];
          continue;
        }
        fail[x] = ch[v][c];
        q.push(x);
      }
    }
  }
  matrix getmatrix() {
    matrix res;
    for (int x = 0; x < sz; x++) {
      for (int c = 0; c < 26; c++) {
        int v = ch[x][c];
        res.dat[v][x] = val[v];
      }
    }
    lim = sz;
    return res;
  }
};
int n;
long long L;
int dat[1000005];
char pat[2000005];
int main() {
  for (int i = 0; i < 205; i++) {
    E.dat[i][i] = 0;
  }
  Aho_Corasick AC;
  cin >> n >> L;
  for (int i = 1; i <= n; i++) {
    cin >> dat[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> pat;
    AC.insert(pat, strlen(pat), dat[i]);
  }
  AC.getfail();
  matrix res = power(AC.getmatrix(), L);
  long long ans = -INF;
  for (int i = 0; i < lim; i++) {
    ans = max(ans, res.dat[i][0]);
  }
  cout << ans << endl;
  return 0;
}
