use proconio::{input, marker::Usize1}; use std::collections::VecDeque; fn main() { input! { n: usize, m: usize, p: usize, y: usize, abc: [(Usize1, Usize1, usize); m], de: [(Usize1, usize); p], } let mut graph = vec![vec![]; n]; for (a, b, c) in abc { graph[a].push((b, c)); graph[b].push((a, c)) } let mut rest_money = vec![0; n]; let mut queue = VecDeque::new(); queue.push_back((0, y)); while let Some((pos, money)) = queue.pop_front() { for &(next, robbed) in &graph[pos] { if rest_money[next] >= money - robbed { continue; } rest_money[next] = money - robbed; queue.push_back((next, money - robbed)); } } let mut ans = 0; for (d, e) in de { ans = ans.max(rest_money[d] / e); } println!("{}", ans); }