#include using namespace std; int main(){ int N; long long K; cin >> N >> K; vector S(N * 2); for (int i = 0; i < N * 2; i++){ cin >> S[i]; } vector> C(N * 2, vector(N * 2)); for (int i = 0; i < N * 2; i++){ for (int j = 0; j < N * 2; j++){ cin >> C[i][j]; } } int cnt = 0; for (int i = 0; i < N * 2; i++){ for (int j = 0; j < N * 2; j++){ if (S[i][j] == '#'){ cnt++; } } } long long ans1 = 0; vector A; for (int i = 0; i < N * 2; i++){ for (int j = 0; j < N * 2; j++){ A.push_back(C[i][j]); } } sort(A.begin(), A.end(), greater()); for (int i = 0; i < cnt; i++){ ans1 += A[i]; } if (cnt % 2 == 1){ cout << ans1 << endl; } else { long long ans2 = K; vector B; for (int i = 0; i < N * 2; i++){ for (int j = 0; j < N; j++){ B.push_back(C[i][j] + C[i][N * 2 - 1 - j]); } } sort(B.begin(), B.end(), greater()); for (int i = 0; i < cnt / 2; i++){ ans2 += B[i]; } cout << max(ans1, ans2) << endl; } }