#include <bits/stdc++.h>
using namespace std;
struct Trie {
  int num, fail;
  int next[26];
} pool[500001];
Trie *const trie = pool + 1;
int cnt;
void init() {
  cnt = 0;
  memset(trie, 0, 2 * sizeof(Trie));
  trie[0].fail = -1;
}
inline int convert(char ch) { return ch - 'a'; }
void insert(char *s, int w) {
  int cur = 0;
  for (int i = 0; s[i]; i++) {
    int &pos = trie[cur].next[convert(s[i])];
    if (!pos) {
      pos = ++cnt;
      memset(&trie[cnt], 0, sizeof(Trie));
    }
    cur = pos;
  }
  trie[cur].num += w;
}
void makeFail() {
  queue<int> q;
  q.push(0);
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    for (int i = 0; i < 26; i++) {
      int &cur = trie[t].next[i];
      if (cur) {
        q.push(cur);
        trie[cur].fail = trie[trie[t].fail].next[i];
        trie[cur].num += trie[trie[cur].fail].num;
      } else
        cur = trie[trie[t].fail].next[i];
    }
  }
}
struct Matrix {
  long long a[201][201];
  int n;
  Matrix(int n) : n(n) {}
  void zero() {
    for (int i = 0; i < n; i++) memset(a[i], 0xc0, sizeof(long long) * n);
  }
  void one() {
    zero();
    for (int i = 0; i < n; i++) a[i][i] = 0;
  }
  Matrix operator*(const Matrix &x) const {
    Matrix r(n);
    r.zero();
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++)
          r.a[i][j] = max(r.a[i][j], a[i][k] + x.a[k][j]);
      }
    }
    return r;
  }
  Matrix operator^(long long k) const {
    Matrix r(n), t = *this;
    r.one();
    for (; k; k >>= 1) {
      if (k & 1) r = r * t;
      t = t * t;
    }
    return r;
  }
};
int w[201];
char s[201];
int main() {
  int n;
  long long m;
  scanf("%d%I64d", &n, &m);
  init();
  for (int i = 0; i < n; i++) scanf("%d", &w[i]);
  for (int i = 0; i < n; i++) {
    scanf("%s", s);
    insert(s, w[i]);
  }
  makeFail();
  Matrix x(cnt + 1);
  x.zero();
  for (int i = 0; i <= cnt; i++) {
    for (int j = 0; j < 26; j++)
      x.a[i][trie[i].next[j]] = trie[trie[i].next[j]].num;
  }
  x = x ^ m;
  long long ans = 0;
  for (int i = 0; i <= cnt; i++) ans = max(ans, x.a[0][i]);
  printf("%I64d", ans);
}
