#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); const long Max = long.MaxValue / 8; var n = I(); var m = I(); var tz = Range(n, () => new List<(int, int)>()); for (var i = 0; i < m; i++) { var u = I() - 1; var v = I() - 1; var w = I(); tz[u].Add((v, w)); tz[v].Add((u, w)); } var az = Range(n, I); var bz = Range(n, I); var cz = Range(n, I); var dz = new long[n]; dz.AsSpan().Fill(Max); dz[0] = 1; var q = new PriorityQueue<(int, long), long>(); q.Enqueue((0, 1), 1); while (q.Count > 0) { var (s, d) = q.Dequeue(); if (d > dz[s]) continue; var (a, b, c) = (az[s], bz[s], cz[s]); var k = (d + a - 1) / a; var na = k * a; foreach (var (j, dd) in tz[s]) { var nd = na + dd; if (k % b == 0) nd = Math.Min(nd + c, nd + a); if (dz[j] > nd) { dz[j] = nd; q.Enqueue((j, nd), nd); } } } var ans = dz[^1]; Console.WriteLine(ans);