#include <bits/stdc++.h>
using namespace std;
int N, C, ch[220][26];
long long L, temp[220][220], v[220], bounty[220], cost[220][220], ans[220][220],
    res;
string s[220];
bool cango[220][220];
int main() {
  cin >> N >> L;
  for (int i = (0); i < (220); i++)
    for (int j = (0); j < (220); j++) cost[i][j] = -1e18, ans[i][j] = -1e18;
  for (int i = (0); i < (N); i++) cin >> v[i];
  for (int i = (0); i < (N); i++) {
    cin >> s[i];
    int x = 0;
    for (int j = (0); j < ((int)s[i].size()); j++) {
      if (!ch[x][s[i][j] - 'a']) ch[x][s[i][j] - 'a'] = ++C;
      x = ch[x][s[i][j] - 'a'];
    }
  }
  for (int i = (0); i < (N); i++) {
    for (int st = (0); st < (C + 1); st++) {
      int x = st;
      bool bad = 0;
      for (int j = (0); j < ((int)s[i].size()); j++) {
        if (!ch[x][s[i][j] - 'a']) {
          bad = 1;
          break;
        }
        x = ch[x][s[i][j] - 'a'];
      }
      if (!bad) {
        bounty[x] += v[i];
      }
    }
  }
  for (int B = (0); B < (C + 1); B++) {
    for (int A = (0); A < (N); A++) {
      int x = B, y = 0;
      for (int rep = (0); rep < ((int)s[A].size()); rep++) {
        if (!ch[x][s[A][rep] - 'a']) break;
        x = ch[x][s[A][rep] - 'a'], y = ch[y][s[A][rep] - 'a'];
        for (int j = (0); j < (26); j++)
          if (ch[y][j]) {
            cango[x][ch[y][j]] = 1;
          }
      }
    }
  }
  for (int x = (0); x < (C + 1); x++)
    for (int j = (0); j < (26); j++)
      if (ch[0][j]) cango[x][ch[0][j]] = 1;
  for (int i = (0); i < (C + 1); i++)
    for (int j = (0); j < (C + 1); j++)
      if (cango[i][j]) cost[i][j] = bounty[j];
  for (int i = (0); i < (C + 1); i++) ans[i][i] = 0;
  while (L) {
    if (L & 1) {
      for (int i = (0); i < (C + 1); i++)
        for (int j = (0); j < (C + 1); j++)
          temp[i][j] = ans[i][j], ans[i][j] = -1e18;
      for (int i = (0); i < (C + 1); i++)
        for (int j = (0); j < (C + 1); j++)
          for (int k = (0); k < (C + 1); k++) {
            ans[i][k] = max(ans[i][k], temp[i][j] + cost[j][k]);
          }
    }
    for (int i = (0); i < (C + 1); i++)
      for (int j = (0); j < (C + 1); j++)
        temp[i][j] = cost[i][j], cost[i][j] = -1e18;
    for (int i = (0); i < (C + 1); i++)
      for (int j = (0); j < (C + 1); j++)
        for (int k = (0); k < (C + 1); k++) {
          cost[i][k] = max(cost[i][k], temp[i][j] + temp[j][k]);
        }
    L /= 2;
  }
  for (int e = (0); e < (C + 1); e++) res = max(res, ans[0][e]);
  printf("%lld\n", res);
  return 0;
}
