#include using namespace std; #define int long long #define FOR(i, a, b) for(ll i = (a); i < (b); ++i) #define FORR(i, a, b) for(ll i = (a); i > (b); --i) #define REP(i, n) for(ll i = 0; i < (n); ++i) #define REPR(i, n) for(ll i = n; i >= 0; i--) #define FOREACH(x, a) for(auto &(x) : (a)) #define VECCIN(x) \ for(auto &youso_ : (x)) cin >> youso_ #define bitcnt __builtin_popcount #define SZ(x) ((ll)(x).size()) #define fi first #define se second #define All(a) (a).begin(), (a).end() template inline T IN() { T x; cin >> x; return (x); } inline void CIN() {} template inline void CIN(Head &&head, Tail &&... tail) { cin >> head; CIN(move(tail)...); } #define CINT(...) \ int __VA_ARGS__; \ CIN(__VA_ARGS__) #define DCIN(...) \ double __VA_ARGS__; \ CIN(__VA_ARGS__) #define LCIN(...) \ ll __VA_ARGS__; \ CIN(__VA_ARGS__) #define SCIN(...) \ string __VA_ARGS__; \ CIN(__VA_ARGS__) #define Yes(a) cout << (a ? "Yes" : "No") << "\n" #define YES(a) cout << (a ? "YES" : "NO") << "\n" #define Printv(v) \ { \ FOREACH(x, v) { cout << x << " "; } \ cout << "\n"; \ } template inline void eputs(T s) { cout << s << "\n"; exit(0); } template void Fill(A (&array)[N], const T &val) { std::fill((T *)array, (T *)(array + N), val); } template using PQG = priority_queue, greater>; template using PQ = priority_queue; typedef long long ll; typedef unsigned long long ul; typedef vector VL; typedef pair PL; const int INF = 1e9; const int MOD = 1e9 + 7; const double PI = atan(1.0) * 4.0; // const int MOD = 998244353; const ll LINF = 9e18; const ll dx[] = {1, 0, -1, 0}; const ll dy[] = {0, 1, 0, -1}; void cinfast() { cin.tie(0); ios::sync_with_stdio(false); } struct edge { ll to, cap, rev; }; struct Mflow { vector> G; VL level, iter; ll N; Mflow(ll size) : N(size) { init(size); }; void init(ll size) { G.resize(N); } void add_edge(ll from, ll to, ll cap) { G[from].push_back({to, cap, (ll)G[to].size()}); G[to].push_back({from, 0, (ll)G[from].size() - 1}); } void bfs(ll s) { level.assign(N, -1); queue q; level[s] = 0; q.push(s); while(!q.empty()) { ll now = q.front(); q.pop(); FOREACH(e, G[now]) { if(e.cap > 0 && level[e.to] == -1) { level[e.to] = level[now] + 1; q.push(e.to); } } } } ll dfs(ll now, ll t, ll f) { if(now == t) return f; for(ll &i = iter[now]; i < G[now].size(); i++) { edge &e = G[now][i]; if(e.cap > 0 && level[now] < level[e.to]) { ll d = dfs(e.to, t, min(f, e.cap)); if(d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } ll max_flow(ll s, ll t) { ll flow = 0; while(1) { bfs(s); if(level[t] < 0) return flow; iter.assign(N, 0); ll f; while((f = dfs(s, t, LINF)) > 0) { flow += f; } } } }; signed main() { LCIN(n, m, d); VL u(m), v(m), p(m), q(m), w(m); vector L; REP(i, m) { cin >> u[i] >> v[i] >> p[i] >> q[i] >> w[i]; q[i] += d; L.emplace_back(u[i], p[i]); L.emplace_back(v[i], q[i]); } sort(All(L)); Mflow mf(L.size() + 2); REP(i, m) { ll from = lower_bound(All(L), PL(u[i], p[i])) - L.begin(); ll to = lower_bound(All(L), PL(v[i], q[i])) - L.begin(); mf.add_edge(from, to, w[i]); } REP(i, L.size() - 1) { if(L[i + 1].fi == L[i].fi) mf.add_edge(i, i + 1, LINF); } REP(i, L.size()) { if(L[i].fi == 1) { mf.add_edge(L.size(), i, LINF); } if(L[i].fi == n) { mf.add_edge(i, L.size() + 1, LINF); } } ll ans = mf.max_flow(L.size(), L.size() + 1); cout << ans << "\n"; }