#include <bits/stdc++.h>
using namespace std;
int dp[(1 << 20) + 4];
char s[24][24];
int a[24][24];
int csum[24][30];
int cmax[24][30];
int cmask[24][30];
int n, m;
int dfs(int mask) {
  if (!mask) return 0;
  if (dp[mask] != -1) return dp[mask];
  int ans = 1e9;
  int i = 0;
  while (!(mask & (1 << i))) i++;
  for (int j = 0; j < m; j++) {
    int ch = s[i][j] - 'a';
    ans = min(ans, dfs(mask & (~cmask[j][ch])) + csum[j][ch] - cmax[j][ch]);
    ans = min(ans, dfs(mask ^ (1 << i)) + a[i][j]);
  }
  dp[mask] = ans;
  return ans;
}
int main() {
  scanf("%d %d", &n, &m);
  int i;
  for (i = 0; i < n; i++) scanf("%s", s[i]);
  int j;
  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++) scanf("%d", &a[i][j]);
  for (j = 0; j < m; j++) {
    for (i = 0; i < n; i++) {
      int ch = s[i][j] - 'a';
      cmax[j][ch] = max(cmax[j][ch], a[i][j]);
      csum[j][ch] += a[i][j];
      cmask[j][ch] |= (1 << i);
    }
  }
  memset(dp, -1, sizeof(dp));
  int ans = dfs((1 << n) - 1);
  printf("%d\n", ans);
  return 0;
}
