#include #include #include using namespace std; struct edge { long long to, cap, rev; }; class Max_Flow { public: vector>X; vectorused; void init(int size__) { X.resize(size__ + 2); used.resize(size__ + 2); } void add_edge(int u, int v, long long cap) { X[u].push_back(edge{ v,cap,(long long)X[v].size() }); X[v].push_back(edge{ u,0LL,(long long)X[u].size() - 1 }); } long long dfs(long long pos, long long to, long long cap) { if (pos == to) return cap; used[pos] = true; for (int i = 0; i < X[pos].size(); i++) { if (X[pos][i].cap <= 0 || used[X[pos][i].to] == true) continue; long long G = dfs(X[pos][i].to, to, min(X[pos][i].cap, cap)); if (G <= 0) continue; X[pos][i].cap -= G; X[X[pos][i].to][X[pos][i].rev].cap += G; return G; } return 0; } long long max_flow(long long u, long long v) { long long E = 0; while (true) { for (int i = 0; i < used.size(); i++) used[i] = false; long long F = dfs(u, v, (1LL << 60)); if (F == 0) break; E += F; } return E; } }; long long n, m, p, a[1009], b[1009], c[1009], d[1009], e[1009]; vector>L; int main() { cin >> n >> m >> p; for (int i = 0; i < m; i++) { cin >> a[i] >> b[i] >> c[i] >> d[i] >> e[i]; d[i] += p; L.push_back(make_pair(a[i], c[i])); L.push_back(make_pair(b[i], d[i])); } sort(L.begin(), L.end()); Max_Flow X; X.init(L.size() + 4); for (int i = 0; i < m; i++) { int pos1 = lower_bound(L.begin(), L.end(), make_pair(a[i], c[i])) - L.begin(); int pos2 = lower_bound(L.begin(), L.end(), make_pair(b[i], d[i])) - L.begin(); X.add_edge(pos1, pos2, e[i]); } for (int i = 1; i < L.size(); i++) { if (L[i].first == L[i - 1].first) X.add_edge(i - 1, i, (1LL << 60)); } for (int i = 0; i < L.size(); i++) { if (L[i].first == 1) X.add_edge(L.size(), i, (1LL << 60)); if (L[i].first == n) X.add_edge(i, L.size() + 1, (1LL << 60)); } cout << X.max_flow(L.size(), L.size() + 1) << endl; return 0; }