using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, m, d) = (c[0], c[1], c[2]); var map = NArr(m); var sets = new HashSet[n]; for (var i = 0; i < n; ++i) sets[i] = new HashSet(); sets[0].Add(0); sets[n - 1].Add(1_000_000_000); foreach (var flight in map) { sets[flight[0] - 1].Add(flight[2]); sets[flight[1] - 1].Add(flight[3] + (flight[1] == n ? 0 : d)); } var lists = new List[n]; for (var i = 0; i < n; ++i) { lists[i] = [.. sets[i]]; lists[i].Sort(); } var dics = new Dictionary[n]; var count = 0; for (var i = 0; i < n; ++i) { dics[i] = new Dictionary(); for (var j = 0; j < lists[i].Count; ++j) { dics[i][lists[i][j]] = count; ++count; } } var g = new AtCoder.MfGraph(count); var INF = long.MaxValue / 10; for (var i = 0; i < n; ++i) { for (var j = 0; j + 1 < lists[i].Count; ++j) { g.AddEdge(dics[i][lists[i][j]], dics[i][lists[i][j + 1]], INF); } } foreach (var flight in map) { var fromi = flight[0] - 1; var toi = flight[1] - 1; var fromtime = flight[2]; var totime = flight[3] + (flight[1] == n ? 0 : d); g.AddEdge(dics[fromi][fromtime], dics[toi][totime], flight[4]); } WriteLine(g.Flow(0, dics[n - 1][1_000_000_000])); } }