#include #include #include #include #include using namespace std; typedef long long LL; typedef pair PII; const int N = 2010, M = N * 2, INF = 2000000010; int n, m, st, a[N], rt_d[N], d[N]; int h[N], e[M], w[M], ne[M], idx; priority_queue, greater> pq; bool vis[N]; LL v1, v2, ans; void Add(int x, int y, int z) { e[idx] = y, w[idx] = z, ne[idx] = h[x], h[x] = idx++; } void Dijkstra(int u) { fill(d + 1, d + n + 1, INF); memset(vis, 0, sizeof(vis)); d[u] = 0; pq.push({ d[u], u }); while (!pq.empty()) { auto [dist, pos] = pq.top(); pq.pop(); if (vis[pos]) continue; vis[pos] = true; for (int i = h[pos]; i != -1; i = ne[i]) { int j = e[i], k = w[i]; if (dist + k < d[j]) { d[j] = dist + k; pq.push({ d[j], j }); } } } } int main() { scanf("%d%d%d", &n, &m, &st); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); memset(h, -1, sizeof(h)); for (int i = 1, x, y, z; i <= m; ++i) { scanf("%d%d%d", &x, &y, &z); Add(x, y, z), Add(y, x, z); } Dijkstra(st); memcpy(rt_d, d, sizeof(d)); // x 为聚集点 ans = 9e18; for (int x = 1; x <= n; ++x) { Dijkstra(x); v1 = 0LL; for (int i = 1; i <= n; ++i) { v1 += 1LL * d[i] * a[i]; } v2 = 9e18; for (int i = 1; i <= n; ++i) { if (a[i]) { v2 = min(v2, 0LL + rt_d[i] - d[i]); } } ans = min(ans, v1 * 2 + (x == st ? 0LL : v2)); } printf("%lld\n", ans); return 0; }