from itertools import accumulate n, k = map(int, input().split()) cnt = sum(input().count('#') for _ in range(2 * n)) INF = 1 << 60 dp = [[-INF] * (cnt + 1) for _ in range(2)] dp[0][0] = 0 for _ in range(2 * n): cs = list(map(int, input().split())) cs_sym = list(accumulate(sorted((cs[i] + cs[2 * n - 1 - i] for i in range(n)), reverse=True))) cs_sorted = list(accumulate(sorted(cs, reverse=True))) for i in range(cnt)[::-1]: v = max(dp[0][i], dp[1][i]) if v != -INF: for j, c in enumerate(cs_sorted, i + 1): if j > cnt: break dp[1][j] = max(dp[1][j], v + c) v = dp[0][i] if v != -INF: for di, c in enumerate(cs_sym, 1): j = i + 2 * di if j > cnt: break dp[0][j] = max(dp[0][j], v + c) print(max(dp[0][cnt] + k, dp[1][cnt]))