#include #include #include #include #define f(i, s, k, l) for (int i = s; i < k; i += l) #define for0(i, k) f(i, 0, k, 1) #define pl pair #define pb push_back #define vl vector #define vi vector #define sz(x) (ll)(x).size() using namespace std; using ll = long long; using ld = long double; struct edge { ll to; ld l, v, newv; }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll n, m, x, y; ld t, l, v, w; cin >> n >> m >> t; vector> adj(n); for0(i, m) { cin >> x >> y >> l >> v >> w; x--; y--; adj[x].pb({y, l, v, w}); adj[y].pb({x, l, v, w}); } vector dist(n, 1e18); priority_queue, vector>, greater>> pq; pq.push({0, 0}); dist[0] = 0; while (!pq.empty()) { pair cur = pq.top(); pq.pop(); if (cur.first > dist[cur.second]) continue; for (auto e : adj[cur.second]) { ld restSlowTime = max((ld) 0, t - cur.first); ld slowLen = min(e.l, e.v * restSlowTime); ld restLen = e.l - slowLen; ld timeTotal = slowLen / e.v + restLen / e.newv; if (cur.first + timeTotal < dist[e.to]) { dist[e.to] = cur.first + timeTotal; pq.push({dist[e.to], e.to}); } } } cout << fixed << setprecision(10) << dist[n - 1] << endl; }