#include <bits/stdc++.h>
using namespace std;
const int inf = (1 << 30) - 1;
const long long linf = (1ll << 62) - 1;
const int N = 300;
int n;
long long l;
int cc = 0;
struct state {
  state *go[256];
  state *link, *parent;
  int endpos;
  bool used, used2;
  char c;
  int num;
  state() {
    link = nullptr;
    endpos = 0;
    for (int i = 0; i < 256; i++) {
      go[i] = nullptr;
    }
    used = false;
    parent = nullptr;
    num = cc++;
    used2 = false;
  }
};
state *root = new state();
int a[N];
string s[N];
void add(const string &s, int value) {
  state *cur = root;
  for (int i = 0; i < ((int)(s).size()); i++) {
    if (cur->go[s[i]] == nullptr) {
      cur->go[s[i]] = new state();
      cur->go[s[i]]->parent = cur;
      cur->go[s[i]]->c = s[i];
    }
    cur = cur->go[s[i]];
  }
  cur->endpos += value;
}
bool used[N][N];
long long mat[N][N], curMat[N][N];
void print(state *root, bool flag = true) {
  if (root == ::root) {
    return;
  }
  print(root->parent, false);
  42;
  if (flag) {
    42;
  }
}
void buildSuffLinks(state *root) {
  if (!root->used) {
    root->used = true;
    buildSuffLinks(root->parent);
    if (root->parent == ::root) {
      root->link = ::root;
    } else {
      root->link = root->parent->link->go[root->c];
    }
    buildSuffLinks(root->link);
    root->endpos += root->link->endpos;
    for (int i = 0; i < 256; i++) {
      if (root->go[i] == nullptr) {
        root->go[i] = root->link->go[i];
      }
    }
  }
}
void buildSuffLinks2(state *root) {
  if (!root->used2) {
    root->used2 = true;
    buildSuffLinks(root);
    for (int i = 0; i < 256; i++) {
      buildSuffLinks2(root->go[i]);
    }
    for (int i = 'a'; i <= 'z'; i++) {
      used[root->num][root->go[i]->num] = true;
      mat[root->num][root->go[i]->num] += root->go[i]->endpos;
    }
  }
}
void mult(long long a[N][N], long long b[N][N]) {
  static long long c[N][N];
  for (int i = 0; i < cc; i++) {
    for (int j = 0; j < cc; j++) {
      long long cur = -linf;
      for (int z = 0; z < cc; z++) {
        cur = max(cur, a[i][z] + b[z][j]);
      }
      c[i][j] = cur;
    }
  }
  for (int i = 0; i < cc; i++) {
    for (int j = 0; j < cc; j++) {
      a[i][j] = c[i][j];
    }
  }
}
void power(long long n) {
  while (n > 0) {
    if (n & 1) {
      mult(curMat, mat);
    }
    mult(mat, mat);
    n >>= 1;
  }
}
int main() {
  cin >> n >> l;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> s[i];
    add(s[i], a[i]);
  }
  for (int i = 0; i < cc; i++) {
    for (int j = 0; j < cc; j++) {
      used[i][j] = false;
    }
  }
  root->parent = root;
  root->link = root;
  root->used = true;
  for (int i = 0; i < 256; i++) {
    if (root->go[i] == nullptr) {
      root->go[i] = root;
    }
  }
  buildSuffLinks2(root);
  for (int i = 0; i < cc; i++) {
    for (int j = 0; j < cc; j++) {
      curMat[i][j] = i == j ? 0 : -linf;
      if (!used[i][j]) {
        mat[i][j] = -linf;
      }
    }
  }
  power(l);
  long long ans = -linf;
  for (int i = 0; i < cc; i++) {
    ans = max(ans, curMat[0][i]);
  }
  cout << ans << endl;
  return 0;
}
