import java.util.PriorityQueue data class Edge(val to: Int, val len: Int, val v:Int) fun main() { val (n, m, t) = readInts() val g = Array(n) { mutableListOf() } repeat(m) { val (a, b, l, v) = readInts() g[a - 1].add(Edge(b - 1, l, v)) g[b - 1].add(Edge(a - 1, l, v)) } fun check(x: Double) : Boolean { val d = DoubleArray(n) { Double.POSITIVE_INFINITY } val done = BooleanArray(n) d[0] = 0.0 val q = PriorityQueue>(compareBy { it.first }) q.add(0.0 to 0) while (!q.isEmpty()) { val (_, v) = q.poll() if (done[v]) continue done[v] = true for (e in g[v]) { if (d[e.to] > d[v] + e.len / (e.v + x)) { d[e.to] = d[v] + e.len / (e.v + x) q.add(d[e.to] to e.to) } } } return d.last() < t } check(90.0) var lf = 0.0 var rg = 1e18 repeat(100) { val mid = (lf + rg) / 2 if (check(mid)) { rg = mid } else { lf = mid } } println("%.10f".format(lf)) } private fun readInt() = readln().toInt() private fun readLongs() = readStrings().map { it.toLong() } private fun readStrings() = readln().split(" ") private fun readInts() = readStrings().map { it.toInt() }