#include <bits/stdc++.h>
using namespace std;
const int N = 18;
int nxt[N][1 << N], vis[1 << N], bad[1 << N], cost[1 << N], dp[1 << N];
char s[1 << N];
vector<int> I[1 << N];
void dfs(int a, int b, int mask) {
  if (vis[mask]) return;
  vis[mask] = bad[mask] = true;
  for (auto i : I[mask])
    if (i != a && i != b) {
      dfs(a, b, mask ^ (1 << i));
    }
}
int F(int mask) {
  if (~dp[mask]) return dp[mask];
  int res = cost[mask];
  for (auto i : I[mask])
    if (!bad[mask ^ (1 << i)]) res = min(res, F(mask ^ (1 << i)));
  return dp[mask] = res;
}
int32_t main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  for (int i = 1; i < (1 << k); i++) {
    for (int j = 0; j < k; j++)
      if ((i >> j) & 1) {
        I[i].push_back(j);
      }
  }
  cin >> s + 1;
  vector<int> t(k, 0);
  for (int i = 1; i <= n; i++) t[s[i] - 'a']++;
  for (int mask = 0; mask < (1 << k); ++mask) {
    for (int i = 0; i < k; i++)
      if ((mask >> i) & 1) {
        cost[mask] += t[i];
      }
  }
  vector<int> cur(k, n + 1);
  for (int i = n; i >= 1; i--) {
    for (int j = 0; j < k; j++) {
      nxt[j][i] = cur[j];
    }
    cur[s[i] - 'a'] = i;
  }
  int tot = (1 << k) - 1;
  for (int i = 0; i < k; i++) {
    for (int j = 0; j < k; j++) {
      int x;
      cin >> x;
      if (!x) {
        memset(vis, 0, sizeof vis);
        for (int l = 1; l <= n; l++)
          if (s[l] - 'a' == i && nxt[j][l] <= n && nxt[j][l] <= nxt[i][l]) {
            int mask = 0;
            for (int q = 0; q < k; q++)
              if (q != i && q != j && nxt[q][l] < nxt[j][l]) {
                mask += 1 << q;
              }
            dfs(i, j, tot ^ mask);
          }
      }
    }
  }
  memset(dp, -1, sizeof dp);
  cout << F(tot) << endl;
}
