## https://yukicoder.me/problems/no/2366 from collections import deque MAX_INT = 10 ** 18 def main(): N, M, K,T = map(int, input().split()) ab_map = [[None for _ in range(M)] for _ in range(N)] for _ in range(K): a, b, c, d = map(int, input().split()) if c > 1: ab_map[a - 1][b - 1] =(c - 1, d) # ストレスの上限をチェック answer = MAX_INT dp = [[{} for _ in range(M)] for _ in range(N)] dp[0][0][(0, 0)] = 0 queue = deque() queue.append((0, 0, 0, 0)) while len(queue) > 0: n, m, revert_time, stress = queue.popleft() d = dp[n][m][(revert_time, stress)] for dn, dm in ((-1, 0), (1, 0), (0, -1), (0, 1)): new_n = dn + n new_m = dm + m if 0 <= new_n < N and 0 <= new_m < M: new_state = (revert_time, stress) if new_state not in dp[new_n][new_m] or dp[new_n][new_m][new_state] > d + 1: dp[new_n][new_m][new_state] = d + 1 queue.append((new_n, new_m, revert_time, stress)) if ab_map[n][m] is not None: c_, d_ = ab_map[n][m] new_revert_time = revert_time + c_ new_stress = stress + d_ if answer >= new_stress: if new_revert_time >= N - 1 + M - 1: if d - new_revert_time + (N - 1 - n + M - 1 - m) <= T: answer = min(answer ,new_stress) else: if d - new_revert_time + (N - 1 - n + M - 1 - m) <= T: answer = min(answer ,new_stress) else: new_state = (new_revert_time, new_stress) if new_state not in dp[n][m] or dp[n][m][new_state] > d: dp[n][m][new_state] = d queue.appendleft((n, m, new_revert_time, new_stress)) for key_state, t in dp[-1][-1].items(): revert_time, stress = key_state if t - revert_time <= T: answer = min(answer, stress) if answer == MAX_INT: print(-1) else: print(answer) if __name__ == '__main__': main()