#include <bits/stdc++.h>
const int INF = 0x3f3f3f3f;
const long long INFLL = 0x3f3f3f3f3f3f3f3f;
using namespace std;
const int MAXN = 205;
const int LEN = 26;
struct Rect {
  long long a[MAXN][MAXN];
  Rect() { memset(a, 0, sizeof(a)); }
  void unit() {
    MINF();
    for (int i = 0; i < MAXN; i++) {
      a[i][i] = 0;
    }
  }
  void MINF() { memset(a, -1, sizeof(a)); }
};
Rect tmp;
Rect operator*(const Rect& a, const Rect& b) {
  tmp.MINF();
  for (int k = 0; k < MAXN; k++) {
    for (int i = 0; i < MAXN; i++) {
      for (int j = 0; j < MAXN; j++) {
        if (a.a[i][j] < 0 || b.a[k][i] < 0) {
          continue;
        }
        tmp.a[k][j] = max(tmp.a[k][j], a.a[i][j] + b.a[k][i]);
      }
    }
  }
  return tmp;
}
struct node {
  int id;
  int cnt;
  node* nxt[LEN];
  node* fail;
  node() : id(0), cnt(0), fail(NULL) { memset(nxt, 0, sizeof(nxt)); }
};
node nodes[MAXN];
int tot = 1;
node* root = nodes;
node* newNode() {
  nodes[tot].id = tot;
  return &nodes[tot++];
}
char mp[256];
void insertS(char* str, int cnt) {
  node* nd = root;
  for (int i = 0; str[i]; i++) {
    int id = mp[str[i]];
    if (!nd->nxt[id]) {
      nd->nxt[id] = newNode();
    }
    nd = nd->nxt[id];
  }
  nd->cnt += cnt;
}
void build() {
  queue<node*> que;
  root->fail = root;
  for (int i = 0; i < LEN; i++) {
    if (!root->nxt[i]) {
      root->nxt[i] = root;
    } else {
      root->nxt[i]->fail = root;
      que.push(root->nxt[i]);
    }
  }
  while (!que.empty()) {
    node* nd = que.front();
    que.pop();
    nd->cnt += nd->fail->cnt;
    for (int i = 0; i < LEN; i++) {
      if (nd->nxt[i]) {
        nd->nxt[i]->fail = nd->fail->nxt[i];
        que.push(nd->nxt[i]);
      } else {
        nd->nxt[i] = nd->fail->nxt[i];
      }
    }
  }
}
Rect tmp2;
Rect rectPow(Rect a, long long n) {
  tmp2.unit();
  for (; n; n >>= 1) {
    if (n & 1) {
      tmp2 = a * tmp2;
    }
    a = a * a;
  }
  return tmp2;
}
int n;
long long m;
char str[MAXN];
int arr[MAXN];
Rect lft;
Rect rt;
int main() {
  for (int i = 0; i < 26; i++) {
    mp[i + 'a'] = i;
  }
  scanf("%d%I64d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
  }
  for (int i = 0; i < n; i++) {
    scanf("%s", str);
    insertS(str, arr[i]);
  }
  build();
  lft.MINF();
  for (int i = 0; i < tot; i++) {
    for (int j = 0; j < LEN; j++) {
      int id = nodes[i].nxt[j]->id;
      lft.a[i][id] = nodes[i].nxt[j]->cnt;
    }
  }
  rt.unit();
  rt = rectPow(lft, m) * rt;
  long long ans = 0;
  for (int i = 0; i < MAXN; i++) {
    ans = max(ans, rt.a[0][i]);
  }
  printf("%lld\n", ans);
  return 0;
}
