#include <bits/stdc++.h>
using namespace std;
const int N = 222;
int ch[N][26];
int fail[N];
int sz;
int val[N];
int ID[256];
int Q[N];
int dep[N];
void Init() {
  sz = 1;
  memset(ch[0], 0, sizeof(ch[0]));
  for (int i = 'a'; i <= 'z'; i++) ID[i] = i - 'a';
}
void Insert(char *s, int value) {
  int p = 0;
  int depth = 0;
  for (; *s; s++) {
    int c = ID[*s];
    if (!ch[p][c]) {
      memset(ch[sz], 0, sizeof(ch[sz]));
      val[sz] = 0;
      ch[p][c] = sz++;
    }
    p = ch[p][c];
    dep[p] = ++depth;
  }
  val[p] += value;
}
void Construct() {
  int *s = Q, *e = Q;
  for (int i = 0; i < 26; i++)
    if (ch[0][i]) {
      *e++ = ch[0][i];
      fail[ch[0][i]] = 0;
    }
  while (s != e) {
    int u = *s++;
    for (int i = 0; i < 26; i++) {
      int &v = ch[u][i];
      if (v) {
        fail[v] = ch[fail[u]][i];
        val[v] += val[fail[v]];
        *e++ = v;
      } else {
        v = ch[fail[u]][i];
      }
    }
  }
}
long long B[210][210];
void Mul(long long a[][210], long long b[][210]) {
  long long c[210][210];
  memset(c, -1, sizeof(c));
  for (int i = 0; i < sz; i++) {
    for (int j = 0; j < sz; j++) {
      for (int k = 0; k < sz; k++)
        if (a[i][k] != -1 && b[k][j] != -1) {
          c[i][j] = max(c[i][j], a[i][k] + b[k][j]);
        }
    }
  }
  memcpy(a, c, sizeof(c));
}
void Pow(long long a[][210], long long k) {
  long long c[210][210];
  memset(c, -1, sizeof(c));
  for (int i = 0; i < sz; i++) c[i][i] = 0;
  while (k) {
    if (k & 1) Mul(c, a);
    Mul(a, a);
    k >>= 1;
  }
  memcpy(a, c, sizeof(c));
}
int main() {
  int n;
  long long m;
  scanf("%d%I64d", &n, &m);
  int a[200];
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
  }
  char s[222];
  Init();
  for (int i = 0; i < n; i++) {
    scanf("%s", s);
    Insert(s, a[i]);
  }
  Construct();
  memset(B, -1, sizeof(B));
  for (int i = 0; i < sz; i++) {
    for (int j = 0; j < 26; j++) {
      int v = ch[i][j];
      B[i][v] = max(B[i][v], (long long)val[v]);
    }
  }
  long long ret = 0;
  Pow(B, m);
  for (int i = 0; i < sz; i++)
    if (B[0][i] > ret) {
      ret = B[0][i];
    }
  printf("%I64d\n", ret);
  return 0;
}
