#include <bits/stdc++.h>
using namespace std;

const int MOD = 998244353;

typedef vector<int> row;
typedef vector<row> matrix;
inline int add(const int &a, const int &b) {
  int c = a + b;
  if (c >= MOD) c -= MOD;
  return c;
}
inline int mult(const int &a, const int &b) {
  return (long long)a * b % MOD;
}
matrix operator*(const matrix &m1, const matrix &m2) {
  int r = m1.size();
  int m = m1.back().size();
  int c = m2.back().size();
  matrix ret(r, row(c, 0));
  for (int i = 0; i < r; i++) {
    for (int k = 0; k < m; k++) {
      for (int j = 0; j < c; j++) {
        ret[i][j] = add(ret[i][j], mult(m1[i][k], m2[k][j]));
      }
    }
  }
  return ret;
}
matrix one(int dim) {
  matrix ret(dim, row(dim, 0));
  for (int i = 0; i < dim; i++) {
    ret[i][i] = 1;
  }
  return ret;
}
matrix operator^(const matrix &m, const int &e) {
  if (e == 0) return one(m.size());
  matrix sqrtm = m ^ (e / 2);
  matrix ret = sqrtm * sqrtm;
  if (e & 1) ret = ret * m;
  return ret;
}

struct Trie {
  int A = 26;
  int N;
  vector<vector<int>> next;
  vector<int> cnt;

  Trie() : N(0) {
    node();
  }

  int node() {
    next.emplace_back(A, -1);
    cnt.emplace_back(0);
    return N++;
  }

  inline int get(char c) {
    return c - 'a';
  }

  inline void insert(string s) {
    int cur = 0;
    for (char c : s) {
      int to = get(c);
      if (next[cur][to] == -1) next[cur][to] = node();
      cur = next[cur][to];
    }
    cnt[cur]++;
  }
};

const int N = 1605;
int id[N][N];
vector<vector<int>> to;
Trie trie;

void dfs(int i, int j) {
  if (i > j) swap(i, j);
  if (~id[i][j]) return;
  id[i][j] = id[j][i] = to.size();
  to.emplace_back();

  for (int c = 0; c < trie.A; c++) {
    int ni = trie.next[i][c];
    int nj = trie.next[j][c];

    if (~ni and ~nj) {
      dfs(ni, nj);
      to[id[i][j]].push_back(id[ni][nj]);
      if (trie.cnt[nj]) {
        dfs(0, ni);
        to[id[i][j]].push_back(id[0][ni]);
      }
      if (trie.cnt[ni]) {
        dfs(0, nj);
        to[id[i][j]].push_back(id[0][nj]);
      }
      if (trie.cnt[ni] and trie.cnt[nj]) {
        dfs(0, 0);
        to[id[i][j]].push_back(id[0][0]);
      }
    }
  }
}

int main() {
  int n, m;
  scanf("%d %d", &n, &m);

  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    trie.insert(s);
  }

  memset(id, -1, sizeof id);
  dfs(0, 0);

  int dim = to.size();
  matrix mat(dim, row(dim, 0));
  for (int i = 0; i < dim; i++) {
    for (int j : to[i]) {
      mat[i][j]++;
    }
  }

  mat = mat ^ m;

  printf("%d\n", mat[0][0]);

  return 0;
}