#include using namespace std; template class fixed_point : T { public: explicit constexpr fixed_point ( T&& t ) noexcept : T(forward(t)) { } template constexpr decltype(auto) operator()( Args&&... args ) const { return T::operator()(*this, forward(args)...); } }; template static inline constexpr decltype(auto) fix (T&& t) noexcept { return fixed_point{forward(t)}; } template class dinic { struct edge { int to; T cap; weak_ptr rev; }; const int n, source, sink; vector ckd; vector dst; vector>> grh; public: static constexpr T inf = numeric_limits::max(); private: void bfs () { queue que; que.emplace(source); dst[source] = 0; while (!que.empty()) { int crr = que.front(); que.pop(); for (auto const& e : grh[crr]) { if (e->cap == 0) continue; int nxt = e->to; if (dst[nxt] != -1) continue; que.push(nxt); dst[nxt] = dst[crr] + 1; } } } T dfs () { return fix ([&](auto dfs, int crr, int f = inf) -> T { if (crr == sink) return f; ckd[crr] = true; for (auto& e : grh[crr]) { int nxt = e->to; if (ckd[nxt] || e->cap == 0 || dst[crr] >= dst[nxt]) continue; T d = dfs(nxt, min(f, e->cap)); if (d > 0) { e->cap -= d; e->rev.lock()->cap += d; return d; } } dst[crr] = -1; return 0; })(source); } public: dinic (int n, int source, int sink) : n(n), source(source), sink(sink), grh(n) {} void insert(int u, int v, T c) { auto e = make_shared(edge{v, c}); auto r = make_shared(edge{u, 0}); e->rev = r; r->rev = e; grh[u].push_back(e); grh[v].push_back(r); } T cal() { T ret = 0; while (true) { dst.assign(n, -1); bfs(); if (dst[sink] == -1) return ret; ckd.assign(n, false); while (true) { T f = dfs(); if (f == 0) break; ret += f; } } } }; int main() { cin.tie(0); cin.sync_with_stdio(false); int n, m, d; cin >> n >> m >> d; vector> vtx(n); vtx.emplace_back(0, -d); vtx.emplace_back(n - 1, 1e9); vector> query; while (m--) { int u, v, p, q, w; cin >> u >> v >> p >> q >> w; u--; v--; query.emplace_back(u, v, p, q, w); vtx.emplace_back(u, p - d); vtx.emplace_back(v, q); } sort(vtx.begin(), vtx.end()); int N = unique(vtx.begin(), vtx.end()) - vtx.begin(); vtx.resize(N); dinic dnc(N, 0, N - 1); for (int i = 0; i < N - 1; i++) { if (vtx[i].first == vtx[i + 1].first) dnc.insert(i, i + 1, dinic::inf); } for (auto const& qry : query) { int u, v, p, q, w; tie(u, v, p, q, w) = qry; int s = find(vtx.begin(), vtx.end(), pair{u, p - d}) - vtx.begin(); int t = find(vtx.begin(), vtx.end(), pair{v, q}) - vtx.begin(); dnc.insert(s, t, w); } int ret = dnc.cal(); cout << ret << endl; return 0; }