#include #include #include using namespace std; struct Edge { unsigned b; unsigned p; unsigned t; }; int main() { unsigned N, M, K; cin >> N >> M >> K; vector> graph(N, vector()); for (unsigned i = 0; i < M; i++) { unsigned ai, bi, pi, ti; cin >> ai >> bi >> pi >> ti; graph[ai-1].push_back({ bi-1, pi, ti }); } // Dijkstra priority_queue, vector>, less>> q; vector dist(N, -1); dist[0] = 0; vector visited(N, false); q.push({ K, 0 }); while (!q.empty()) { long long timeleft = q.top().first; long long node = q.top().second; q.pop(); visited[node] = true; for (Edge& ne : graph[node]) { if (visited[ne.b]) continue; long long nd = (dist[node] > -1) * dist[node] + ne.p; if (dist[ne.b] == -1 || nd < dist[ne.b]) { dist[ne.b] = nd; q.push({ timeleft - ne.t, ne.b }); } } } cout << dist[N-1]; }