#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template class EdgeBase { public: int to, rev; T cap; EdgeBase(){}; EdgeBase(int to0, T cap0){to = to0; cap = cap0;} EdgeBase(int to0, T cap0, int rev0){to = to0; cap = cap0; rev = rev0;} }; typedef EdgeBase Edge; template T maxFlow(const vector > >& edges0, int source, int sink) { static const T INF = numeric_limits::max(); static const T EPS = static_cast(1.0e-10); static vector > > edges; static vector index; static vector level; class Func{ public: static void bfs(int s){ int n = edges.size(); level.assign(n, -1); queue q; level[s] = 0; q.push(s); while(!q.empty()){ int v = q.front(); q.pop(); for(auto& e : edges[v]){ if(e.cap > EPS && level[e.to] < 0){ level[e.to] = level[v] + 1; q.push(e.to); } } } } static T dfs(int s, int t, T f){ if(s == t) return f; for(auto& e : edges[s]){ if(e.cap > EPS && level[s] < level[e.to]){ T g = dfs(e.to, t, min(f, e.cap)); if(g > EPS){ e.cap -= g; edges[e.to][e.rev].cap += g; return g; } } } return 0; } }; if(source == sink) return INF; int n = edges0.size(); edges.assign(n, vector >()); for(int i=0; i(e.to, e.cap, edges[e.to].size())); edges[e.to].push_back(EdgeBase(i, 0, edges[i].size()-1)); } } T ret = 0; for(;;){ Func::bfs(source); if(level[sink] < 0) return ret; index.assign(n, 0); for(;;){ T f = Func::dfs(source, sink, INF); if(f == 0) break; ret += f; } } } const long long INF = LLONG_MAX / 2; int main() { int n, m, d; cin >> n >> m >> d; vector > edges(m*2+2); int source = m*2; int sink = m*2+1; vector > > t(n); t[0].push_back(make_pair(-1, source)); t[n-1].push_back(make_pair(INF, sink)); for(int i=0; i> u >> v >> p >> q >> w; -- u; -- v; p = p * 2 + 1; q = (q + d) * 2; edges[2*i].push_back(Edge(2*i+1, w)); t[u].push_back(make_pair(p, 2*i)); t[v].push_back(make_pair(q, 2*i+1)); } for(int i=0; i