#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(&)! } template ostream& operator<<(ostream &os, vector &v) { os << "\n["; for(T &x : v) os << x << ','; return os << "]\n"; } struct pairhash { public: template size_t operator()(const pair &p) const { size_t lhs = hash()(p.x); size_t rhs = hash()(p.y); return lhs ^ (rhs+0x9e3779b9+(lhs<<6)+(lhs>>2)); } }; struct road { ll v; ld d, l; road(ll _v, ld _d, ld _l) : v(_v), d(_d), l(_l) {} }; void run() { ll n, m, t; cin >> n >> m >> t; vector> adj(n); for (ll i = 0; i < m; i++) { ll u, v, d, l; cin >> u >> v >> d >> l; u--; v--; road r1(v,d,l), r2(u,d,l); adj[u].pb(r1); adj[v].pb(r2); } ld lower = 0, upper = n*10'000'000; while (upper - lower > 0.00000001) { ld mid = (lower + upper)/2; vector d(n, n*10'000'000); d[0] = 0; set> Q{pair{0,0}}; while (!Q.empty()) { int v = Q.begin()->y; Q.erase(Q.begin()); for (road r : adj[v]) if (d[v] + r.d/(r.l + mid) < d[r.v]) { Q.erase(ii(d[r.v], r.v)); Q.emplace(d[r.v] = d[v] + r.d/(r.l + mid), r.v); } } if (d[n-1] <= t) { upper = mid; } else { lower = mid; } } cout << lower << 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; }