#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const long long INFLL = 1e18 + 1;
const int MAX = 100001;
const long long MOD = 1000000007;
const int SZ = 300100;
const double PI = 3.14159265358979323846264338327;
long long inq(long long k, long long q, long long mod) {
  if (q == 0) return 1;
  long long l = inq(k, q / 2, mod);
  if (q % 2 == 0)
    return l * l % mod;
  else
    return l * l % mod * k % mod;
}
long long gcd(long long a, long long b) {
  if (a < b) swap(a, b);
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long cubr(long long a) {
  long long l = -1, r = 1e6 + 2;
  while (l < r - 1) {
    long long mid = (l + r) / 2;
    if (mid * mid * mid > a)
      r = mid;
    else
      l = mid;
  }
  return l;
}
long long max(long long a, long long b) {
  if (a > b) return a;
  return b;
}
long long min(long long a, long long b) { return -1 * max(-a, -b); }
long long possible(long long q) {
  if (q == INF) return -1;
  return q;
}
bool correct(int x, int xx) {
  if (x < 0) return 0;
  if (x >= xx) return 0;
  return 1;
}
long long dsumm(long long x, long long k) {
  long long y = 1;
  long long z = 0;
  for (int i = 0; y < 1e18; i += 1) {
    z += x / y % k;
    y *= k;
  }
  return z;
}
long long dcount(long long x) {
  long long y = 1;
  long long z = 0;
  int c[100];
  for (int i = 0; i < 10; i += 1) c[i] = 0;
  for (int i = 0; x > 0; i += 1) {
    if (c[x / y % 10] == 0) z++;
    c[x / y % 10] = 1;
    x /= 10;
  }
  return z;
}
long long lg10(long long x) {
  if (10000 <= x && x < 100000) return 5;
  if (x == 0) return 0;
  return lg10(x / 10) + 1;
}
long long g(long long x, long long mod) {
  if (x == 0) return 0;
  return x / mod + g(x / mod, mod);
}
bool is_digit(char c) { return ('0' <= c && c <= '9'); }
string s;
int n, p;
int a[50][50];
int b[3000000];
int marks[(1 << 17)][20][20];
int r[3000000];
int dp[3000000];
int len[3000000];
int cnt[50];
void mark(int mask, int i, int j) {
  if (marks[mask][i][j] == 0) return;
  marks[mask][i][j] = 0;
  for (int k = 0; k < p; k++) {
    if (((1 << k) & mask) == 0 && k != i && k != j) {
      int m2 = (mask + (1 << k));
      if (marks[m2][i][j] == 1) mark(m2, i, j);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> p;
  cin >> s;
  for (int(i) = 0; (i) != (n); i += 1) b[i] = s[i] - 'a';
  for (int(i) = 0; (i) != (n); i += 1) cnt[b[i]]++;
  for (int i = 0; i < p; i++) {
    for (int j = 0; j < p; j++) {
      cin >> a[i][j];
    }
  }
  for (int i = 0; i < (1 << p); i++) {
    r[i] = 1;
    for (int j = 0; j < p; j++) {
      for (int k = 0; k < p; k++) {
        marks[i][j][k] = 1;
      }
    }
  }
  for (int i = 0; i < p; i++) {
    for (int j = 0; j < p; j++) {
      if (a[i][j] == 0) {
        long long calc = 0;
        long long mask = 0;
        for (int k = 0; k < n; k++) {
          if (b[k] == j) {
            if (calc == 1) {
              mark(mask, i, j);
            }
            calc = 0;
            mask = 0;
          }
          if (b[k] == i) {
            calc = 1;
            mask = 0;
          }
          if (b[k] != i && b[k] != j && calc == 1) mask |= (1 << b[k]);
        }
      }
    }
  }
  for (int i = 0; i < (1 << p); i++) {
    r[i] = 1;
    for (int j = 0; j < p; j++) {
      for (int k = 0; k < p; k++) {
        r[i] = min(r[i], marks[i][j][k]);
      }
    }
  }
  dp[0] = 1;
  int ans = n;
  for (int i = 1; i < (1 << p); i++) {
    for (int j = 0; j < p; j++) {
      if (i & (1 << j)) {
        int ii = i - (1 << j);
        if (dp[ii] && r[i]) {
          dp[i] = 1;
          int first = n;
          for (int k = 0; k < p; k++) {
            if ((1 << k) & i) {
              first -= cnt[k];
            }
          }
          ans = min(first, ans);
        }
      }
    }
  }
  cout << ans;
}
