#include <bits/stdc++.h>
using namespace std;
const long long inf = ~0ull >> 3;
struct mat {
  int sz;
  long long r[205][205];
  mat(int _sz = 0) {
    sz = _sz;
    for (int i = 0; i < sz; ++i) {
      for (int j = 0; j < sz; ++j) {
        r[i][j] = -inf;
      }
    }
  }
  mat operator*(const mat& z) {
    mat res(sz);
    for (int i = 0; i < sz; ++i) {
      for (int j = 0; j < sz; ++j) {
        for (int k = 0; k < sz; ++k) {
          res.r[i][j] = max(res.r[i][j], r[i][k] + z.r[k][j]);
        }
      }
    }
    return res;
  }
  void E() {
    for (int i = 0; i < sz; ++i) r[i][i] = 0;
  }
};
mat matpow(mat a, long long k) {
  mat res(a.sz);
  res.E();
  while (k) {
    if (k & 1) res = res * a;
    a = a * a;
    k >>= 1;
  }
  return res;
}
struct Trie {
  int son[205][30], fail[205];
  long long end[205];
  int root, alloc;
  int newnode() {
    memset(son[alloc], -1, sizeof(son[alloc]));
    fail[alloc] = end[alloc] = 0;
    return alloc++;
  }
  void init() {
    alloc = 0;
    root = newnode();
  }
  void insert(char* s, long long val) {
    int p = root;
    for (int i = 0; s[i]; ++i) {
      if (son[p][s[i] - 'a'] == -1) son[p][s[i] - 'a'] = newnode();
      p = son[p][s[i] - 'a'];
    }
    end[p] += val;
  }
  void build() {
    queue<int> q;
    fail[root] = root;
    for (int i = 0; i < 26; ++i) {
      if (son[root][i] == -1)
        son[root][i] = root;
      else {
        fail[son[root][i]] = root;
        q.push(son[root][i]);
      }
    }
    while (!q.empty()) {
      int p = q.front();
      q.pop();
      if (end[fail[p]]) end[p] += end[fail[p]];
      for (int i = 0; i < 26; ++i) {
        if (son[p][i] == -1)
          son[p][i] = son[fail[p]][i];
        else {
          fail[son[p][i]] = son[fail[p]][i];
          q.push(son[p][i]);
        }
      }
    }
  }
  long long solve(long long l) {
    mat res(alloc);
    for (int i = 0; i < alloc; ++i) {
      for (int j = 0; j < 26; ++j) {
        if (son[i][j])
          res.r[i][son[i][j]] = max(res.r[i][son[i][j]], end[son[i][j]]);
      }
    }
    res = matpow(res, l);
    long long ans = -1;
    for (int i = 0; i < alloc; ++i) ans = max(ans, res.r[0][i]);
    return ans;
  }
} ac;
char s[205];
long long num[205];
int main() {
  ac.init();
  int n;
  long long l;
  scanf("%d%lld", &n, &l);
  for (int i = 0; i < n; ++i) scanf("%lld", num + i);
  for (int i = 0; i < n; ++i) {
    scanf("%s", s);
    ac.insert(s, num[i]);
  }
  ac.build();
  printf("%lld\n", ac.solve(l));
}
