#include <bits/stdc++.h>
using namespace std;
template <class T>
T sqr(T x) {
  return x * x;
}
const long long inf = 1e14;
struct mat {
  long long a[301][301];
} p;
int n;
long long l;
int a[301];
char str[301];
int m;
class TrieGraph {
 public:
  static const int SIZE = 100005;
  static const int LEAF = 26;
  int next[SIZE], e[SIZE][LEAF], n;
  int data[SIZE];
  TrieGraph() { n = SIZE; }
  void init() {
    fill_n(next, n, 0);
    fill_n(data, n, 0);
    memset(e, -1, n * sizeof(e[0]));
    n = 1;
  }
  void insert(const char* s, int t) {
    int x = 0;
    for (int i = 0; s[i]; i++) {
      int c = s[i] - 'a';
      x = ~e[x][c] ? e[x][c] : e[x][c] = n++;
    }
    data[x] += a[t];
  }
  void make() {
    static int q[SIZE], m;
    next[0] = m = 0;
    for (int c = 0; c < LEAF; c++)
      if (~e[0][c])
        next[q[m++] = e[0][c]] = 0;
      else
        e[0][c] = 0;
    for (int i = 0; i < m; i++) {
      int x = q[i];
      data[x] += data[next[x]];
      for (int c = 0; c < LEAF; c++) {
        int t = e[next[x]][c];
        if (~e[x][c])
          next[q[m++] = e[x][c]] = t;
        else
          e[x][c] = t;
      }
    }
  }
} TG;
inline mat mul(mat a, mat b) {
  mat c;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) c.a[i][j] = -inf;
  for (int k = 0; k < m; k++)
    for (int i = 0; i < m; i++)
      for (int j = 0; j < m; j++)
        c.a[i][j] = max(c.a[i][j], a.a[i][k] + b.a[k][j]);
  return c;
}
inline mat calc(mat a, long long p) {
  mat ret;
  int ini = 0;
  for (; p; p >>= 1, a = mul(a, a))
    if (p & 1) {
      if (ini)
        ret = mul(ret, a);
      else {
        ini = 1;
        ret = a;
      }
    }
  return ret;
}
int main() {
  cin >> n >> l;
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  TG.init();
  for (int i = 1; i <= n; i++) {
    scanf("%s", &str);
    int m = strlen(str);
    TG.insert(str, i);
  }
  TG.make();
  m = TG.n;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < m; j++) p.a[i][j] = -inf;
  for (int i = 0; i < m; i++) {
    for (int ch = 0; ch < 26; ch++) p.a[i][TG.e[i][ch]] = TG.data[TG.e[i][ch]];
  }
  mat ret = calc(p, l);
  long long ans = 0;
  for (int i = 0; i < m; i++) ans = max(ans, ret.a[0][i]);
  cout << ans << endl;
}
