#include <bits/stdc++.h>
using namespace std;
const int MX = 200 + 5;
const int matX = 200 + 5;
const int INF = 0x3f3f3f3f;
const long long INFLL = 0X3f3f3f3f3f3f3f3f;
long long m;
int val[MX], n;
struct AC_machine {
  int rear, root;
  int Next[MX][26], Fail[MX], End[MX];
  void Init() {
    rear = 0;
    root = New();
  }
  int New() {
    rear++;
    End[rear] = 0;
    for (int i = 0; i < 26; i++) {
      Next[rear][i] = -1;
    }
    return rear;
  }
  void Add(char *A, int val) {
    int n = strlen(A), now = root;
    for (int i = 0; i < n; i++) {
      int id = A[i] - 'a';
      if (Next[now][id] == -1) {
        Next[now][id] = New();
      }
      now = Next[now][id];
    }
    End[now] += val;
  }
  void Build() {
    queue<int> Q;
    Fail[root] = root;
    for (int i = 0; i < 26; i++) {
      if (Next[root][i] == -1) {
        Next[root][i] = root;
      } else {
        Fail[Next[root][i]] = root;
        Q.push(Next[root][i]);
      }
    }
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      End[u] += End[Fail[u]];
      for (int i = 0; i < 26; i++) {
        if (Next[u][i] == -1) {
          Next[u][i] = Next[Fail[u]][i];
        } else {
          Fail[Next[u][i]] = Next[Fail[u]][i];
          Q.push(Next[u][i]);
        }
      }
    }
  }
} AC;
struct Matrix {
  int n, m;
  long long s[matX][matX];
  Matrix(int n = 0, int m = 0) : n(n), m(m) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) s[i][j] = -INFLL;
    }
  }
  Matrix operator*(const Matrix &P) const {
    Matrix ret(n, P.m);
    for (int i = 0; i < n; i++) {
      for (int k = 0; k < m; k++) {
        for (int j = 0; j < P.m; j++) {
          ret.s[i][j] = max(ret.s[i][j], s[i][k] + P.s[k][j]);
        }
      }
    }
    return ret;
  }
  Matrix operator^(const long long &P) const {
    if (P == 1) return *this;
    long long num = P - 1;
    Matrix ret = *this, tmp = *this;
    while (num) {
      if (num & 1) ret = ret * tmp;
      tmp = tmp * tmp;
      num >>= 1;
    }
    return ret;
  }
} MA;
int main() {
  scanf("%d%I64d", &n, &m);
  AC.Init();
  for (int i = 1; i <= n; i++) {
    scanf("%d", &val[i]);
  }
  for (int i = 1; i <= n; i++) {
    char tmp[205];
    scanf("%s", tmp);
    AC.Add(tmp, val[i]);
  }
  AC.Build();
  int rear = AC.rear;
  MA.n = MA.m = rear;
  for (int i = 0; i < rear; i++) {
    for (int j = 0; j < rear; j++) MA.s[i][j] = -INFLL;
  }
  for (int i = 1; i <= rear; i++) {
    for (int j = 0; j < 26; j++) {
      int v = AC.Next[i][j];
      MA.s[i - 1][v - 1] = AC.End[v];
    }
  }
  MA = MA ^ m;
  long long ans = -INFLL;
  for (int i = 0; i < rear; i++) {
    ans = max(ans, MA.s[0][i]);
  }
  printf("%I64d\n", ans);
  return 0;
}
