#include <bits/stdc++.h>
using namespace std;
int n, a[205];
long long l, res;
char buf[205];
class AC_automaton {
 private:
  int cnt;
  struct Node {
    int ch[26];
    int fail;
    int val;
    Node() {
      val = fail = 0;
      memset(ch, 0, sizeof ch);
    }
  } node[205];
  inline int newNode() {
    node[cnt] = Node();
    return cnt++;
  }

 public:
  AC_automaton() { clear(); }
  AC_automaton(const char *s, int val) {
    clear();
    insert(s, val);
  }
  AC_automaton(const AC_automaton &a) { *this = a; }
  inline int root() { return 0; }
  inline unsigned long size() { return (unsigned long)cnt; }
  int *operator[](const int &x) { return node[x].ch; }
  int failink(const int &x) const { return node[x].fail; }
  int &operator()(const int &x) { return node[x].val; }
  inline void clear() {
    cnt = 0;
    newNode();
  }
  void insert(const char *buf, int v) {
    int u = 0;
    while (*buf) {
      int &p = node[u].ch[*buf - 'a'];
      bool(p) ? u = p : u = p = newNode();
      ++buf;
    }
    node[u].val += v;
  }
  void build() {
    queue<int> q;
    for (int i = 0; i < 26; ++i) {
      int v = node[0].ch[i];
      if (v) node[v].fail = 0, q.push(v);
    }
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      node[u].val += node[node[u].fail].val;
      for (int i = 0; i < 26; ++i) {
        int &v = node[u].ch[i];
        if (v)
          node[v].fail = node[node[u].fail].ch[i], q.push(v);
        else
          v = node[node[u].fail].ch[i];
      }
    }
  }
};
AC_automaton ac;
struct matrix {
  int n, m;
  long long a[205][205];
  matrix() { resize(0, 0); }
  matrix(int n_, int m_) { resize(n_, m_); }
  void resize(int n_, int m_) {
    n = n_, m = m_;
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < m; ++j) a[i][j] = -1;
  }
  long long *operator[](const int &x) { return a[x]; }
  matrix operator*(const matrix &t) {
    int p = t.m;
    matrix res(n, p);
    for (int i = 0; i < n; ++i)
      for (int j = 0; j < p; ++j)
        for (int k = 0; k < m; ++k) {
          if (!~a[i][k] || !~t.a[k][j]) continue;
          res.a[i][j] = max(res.a[i][j], a[i][k] + t.a[k][j]);
        }
    return res;
  }
  matrix operator^(long long b) {
    b--;
    matrix t = *this, res = t;
    while (b > 0) {
      if (b & 1) res = res * t;
      t = t * t, b >>= 1;
    }
    return res;
  }
};
matrix ans, p;
int main() {
  scanf("%d%lld", &n, &l);
  for (int i = 1; i <= n; scanf("%d", &a[i++]))
    ;
  for (int i = 1; i <= n; ++i) scanf("%s", buf), ac.insert(buf, a[i]);
  ac.build();
  p.resize(ac.size(), ac.size());
  for (int u = 0; u < ac.size(); ++u)
    for (int i = 0; i < 26; ++i) p[u][ac[u][i]] = ac(ac[u][i]);
  ans.resize(1, ac.size());
  ans[0][0] = 0;
  p = p ^ l;
  ans = ans * p;
  for (int i = 0; i < ac.size(); ++i) res = max(res, ans[0][i]);
  printf("%lld\n", res);
  return 0;
}
