#include using namespace std; typedef long long ll; #define int ll const int inf = 1e18; int n, m, s, dis[2007], tmp[2007], t[2007]; bool vis[2007]; struct edge { int v, w; }; vector e[2007]; struct node { int u, w; inline bool operator<(const node &X) const { return X.w < w; } }; priority_queue q; inline void Dij(int s) { for (int i = 1; i <= n; i++) vis[i] = 0, dis[i] = inf; dis[s] = 0; q.push({s, 0}); while (!q.empty()) { int u = q.top().u; q.pop(); if (vis[u]) continue; vis[u] = 1; for (auto X : e[u]) { int v = X.v, w = X.w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; q.push({v, dis[v]}); } } } return; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> s; for (int i = 1; i <= n; i++) cin >> t[i]; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; e[u].push_back({v, w}); e[v].push_back({u, w}); } Dij(s); for (int i = 1; i <= n; i++) tmp[i] = dis[i]; int res = inf; for (int i = 1; i <= n; i++) { Dij(i); int sum = 0; for (int j = 1; j <= n; j++) sum += 2 * dis[j] * t[j]; sum -= dis[s]; res = min(res, sum); sum += dis[s]; for (int j = 1; j <= n; j++) if (t[j]) res = min(res, sum - dis[j] + tmp[j]); } cout << res; }