#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
double solve(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr) {
vector<vector<pair<int, int>>> adj(N);
for(int i = 0; i < M; ++i) {
adj[x[i]].emplace_back(y[i], c[i]);
adj[y[i]].emplace_back(x[i], c[i]);
}
vector<double> dist(N, DBL_MAX);
priority_queue<pair<double, int>, vector<pair<double, int>>, greater<pair<double, int>>> dijkstra;
dijkstra.emplace(0, H);
arr[0] = -1;
queue<int> bfs; bfs.push(0);
vector<bool> visited_0(N);
while(!bfs.empty()) {
int u = bfs.front(); bfs.pop();
if(visited_0[u]) continue;
visited_0[u] = true;
if(arr[u] == 0) arr[u] = -1;
if(u == H) continue; // we can't move from H
for(auto [v, c]: adj[u]) bfs.push(v);
}
double min_dist = DBL_MAX;
while(!dijkstra.empty()) {
auto [d, u] = dijkstra.top();
dijkstra.pop();
if(d >= dist[u]) continue;
dist[u] = d;
if(arr[u] == -1) {
min_dist = min(min_dist, d);
}
for(auto [v, cv]: adj[u]) {
dijkstra.emplace(d + cv, v);
}
}
if(min_dist == DBL_MAX) return -1;
return min_dist;
}