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, l) = (c[0], c[1], c[2] - 1); var t = NList; var map = NArr(m); var tree = new List<(int to, long len)>[n]; for (var i = 0; i < n; ++i) tree[i] = new List<(int to, long len)>(); foreach (var edge in map) { tree[edge[0] - 1].Add((edge[1] - 1, edge[2])); tree[edge[1] - 1].Add((edge[0] - 1, edge[2])); } var dp = new long[n, n]; var INF = long.MaxValue / 2; for (var i = 0; i < n; ++i) { for (var j = 0; j < n; ++j) if (i != j) dp[i, j] = INF; Calc(tree, i, dp); } var ans = INF; for (var i = 0; i < n; ++i) { var sub = 0L; for (var j = 0; j < n; ++j) sub += dp[i, j] * t[j] * 2; for (var j = 0; j < n; ++j) { ans = Math.Min(ans, sub + dp[l, j] - dp[i, j] * (t[j] > 0 ? 1 : 0)); } } WriteLine(ans); } static void Calc(List<(int to, long len)>[] tree, int start, long[,] dp) { var pq = new PriorityQueue<(int pos, long len), long>(); pq.Enqueue((start, 0), 0); while (pq.Count > 0) { var cur = pq.Dequeue(); if (dp[start, cur.pos] != cur.len) continue; foreach (var next in tree[cur.pos]) { if (dp[start, next.to] <= cur.len + next.len) continue; dp[start, next.to] = cur.len + next.len; pq.Enqueue((next.to, dp[start, next.to]), dp[start, next.to]); } } } }