# https://yukicoder.me/problems/no/2094 def main(): N, K = map(int, input().split()) S = [] for _ in range(2 * N): S.append(input()) C = [] for _ in range(2 * N): C.append(list(map(int, input().split()))) # 黒の数を足し合わせる black_num = 0 for i in range(2 * N): for j in range(2 * N): if S[i][j] == "#": black_num += 1 # 何も考えずに最適化する array = [] for i in range(2 * N): for j in range(2 * N): array.append((C[i][j], i, j)) array.sort(reverse=True) answer = 0 cells = [[False] * (2 * N ) for _ in range(2 * N)] for index in range(black_num): c, i, j = array[index] answer += c cells[i][j] = True is_symmetry = True for i in range(2 * N): for j in range(N): if cells[i][j] != cells[i][2 * N - 1 - j]: is_symmetry = False break if is_symmetry: answer += K # あらかじめ対称性を狙っていく if black_num % 2 == 0: black_pair_num = black_num // 2 array = [] for i in range(2 * N): for j in range(N): c1 = C[i][j] c2 = C[i][2 * N - 1 - j] array.append(c1 + c2) array.sort(reverse=True) ans = K for i in range(black_pair_num): ans += array[i] answer = max(ans, answer) print(answer) if __name__ == "__main__": main()