def dfs(v, t, f): if v == t: return f used[v] = True for to in G[v]: if not used[to] and G[v][to] > 0: d = dfs(to, t, min(f, G[v][to])) if d > 0: G[v][to] -= d G[to][v] += d return d return 0 N, M, d = map(int, input().split()) L = [] T = [set() for _ in range(N)] for _ in range(M): u, v, p, q, c = map(int, input().split()) u -= 1 v -= 1 q += d L.append((u, v, p, q, c)) T[u].add(p) T[v].add(q) V = sum([len(t) for t in T]) G = [{} for _ in range(V)] x = 0 idx = {} for u in range(N): t = sorted(T[u]) idx[(u, t[0])] = x for i in range(1, len(t)): idx[(u, t[i])] = x + 1 G[x][x+1] = float('inf') G[x+1][x] = 0 x += 1 x += 1 for u, v, p, q, c in L: x = idx[(u, p)] y = idx[(v, q)] G[x][y] = G[x].get(y, 0) + c G[y][x] = 0 flow = 0 while True: used = [False] * V f = dfs(0, V-1, float('inf')) if f == 0: break flow += f print(flow)