#include #include #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; typedef long long ll; typedef long double ld; typedef pair ii; typedef vector vi; typedef vector vvi; typedef vector vii; #define x first #define y second #define pb push_back #define eb emplace_back #define rep(i,a,b) for(auto i=(a); i<(b); ++i) #define REP(i,n) rep(i,0,n) #define all(v) (v).begin(), (v).end() #define rs resize #define DBG(x) cerr << __LINE__ << ": " << #x << " = " << (x) << endl const ld PI = acos(-1.0); template using min_queue = priority_queue, greater>; template int sz(const T &x) { return (int) x.size(); // copy the ampersand(&)! } // START OF ACTUAL PROGRAM, START READING HERE void run() { ll n, m, t; cin >> n >> m >> t; vector>> adj(n); for (ll i = 0; i < m; i++) { ll x, y, l, v, w; cin >> x >> y >> l >> v >> w; x--; y--; adj[x].pb({{y,l},{v,w}}); adj[y].pb({{x,l},{v,w}}); } vector d(n, -1); priority_queue> Q; d[0] = 0; Q.push({0, 0}); while (!Q.empty()) { pair dk = Q.top(); Q.pop(); ll k = dk.y; ld t0 = -dk.x; if (t0 > d[k]) continue; for (pair p : adj[k]) { ll x = p.x.x; ld l = p.x.y, v = p.y.x, w = p.y.y; ld t1; if (t0 + l/v < t) { t1 = t0 + l/v; } else if (t0 >= t) { t1 = t0 + l/w; } else { t1 = t + (l-(t-t0)*v)/w; } if (d[x] < 0 || t1 < d[x]) { d[x] = t1; Q.push({-t1, x}); } } } cout << d[n-1] << endl; } signed main() { // DON'T MIX "scanf" and "cin"! ios_base::sync_with_stdio(false); cin.tie(NULL); cout << fixed << setprecision(20); run(); return 0; }