#include <bits/stdc++.h>
using namespace std;
function<void(void)> ____ = []() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
};
const int MAXN = 222;
int n;
long long m;
template <int N>
struct Matrix {
  long long mat[N][N];
  Matrix(long long x) {
    for (int i = 0; i < N; i++)
      for (int j = 0; j < N; j++) mat[i][j] = i == j ? x : -1;
  }
  long long* operator[](int I) { return mat[I]; }
  Matrix operator*(Matrix rhs) {
    Matrix ret(-1);
    for (int i = 0; i < N; i++)
      for (int j = 0; j < N; j++)
        for (int k = 0; k < N; k++) {
          if (mat[i][k] < 0 or rhs[k][j] < 0) continue;
          ret[i][j] = max(ret[i][j], mat[i][k] + rhs[k][j]);
        }
    return ret;
  }
  Matrix operator^(long long b) {
    Matrix ret(0), a(*this);
    for (; b; b >>= 1, a = a * a) {
      if (b & 1) ret = ret * a;
    }
    return ret;
  }
};
using matrix = Matrix<207>;
struct Aho_chrosick {
  int tot, ch[MAXN][26], fail[MAXN], w[MAXN];
  vector<int> G[MAXN];
  Aho_chrosick() {
    tot = 0;
    memset(ch, 0, sizeof(ch));
  }
  void insert(char* s, int wt) {
    int u = 0;
    for (int i = 0; s[i]; i++) {
      int c = s[i] - 'a';
      if (!ch[u][c]) ch[u][c] = ++tot;
      u = ch[u][c];
    }
    w[u] += wt;
  }
  void buildFail() {
    queue<int> que;
    for (int c = 0; c < 26; c++) {
      if (!ch[0][c]) continue;
      fail[ch[0][c]] = 0;
      que.push(ch[0][c]);
    }
    while (!que.empty()) {
      int u = que.front();
      que.pop();
      for (int c = 0; c < 26; c++) {
        if (!ch[u][c]) {
          ch[u][c] = ch[fail[u]][c];
          continue;
        }
        int v = ch[u][c];
        que.push(v);
        int p = fail[u];
        while (p and !ch[p][c]) p = fail[p];
        fail[v] = ch[p][c];
      }
    }
    for (int i = 1; i <= tot; i++) G[fail[i]].push_back(i);
  }
  void dfs(int u) {
    for (int v : G[u]) w[v] += w[u], dfs(v);
  }
} aho;
int awd[MAXN];
char buf[MAXN];
matrix M(-1), F(-1);
void solve() {
  scanf("%d %lld", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &awd[i]);
  for (int i = 1; i <= n; i++) {
    scanf("%s", buf);
    aho.insert(buf, awd[i]);
  }
  aho.buildFail();
  aho.dfs(0);
  F[0][0] = 0;
  for (int i = 0; i <= aho.tot; i++)
    for (int c = 0; c < 26; c++) {
      M[i][aho.ch[i][c]] = aho.w[aho.ch[i][c]];
    }
  M = F * (M ^ m);
  long long ret = 0;
  for (int i = 0; i <= aho.tot; i++) ret = max(ret, M[0][i]);
  cout << ret << endl;
}
int main() {
  solve();
  return 0;
}
