#include using namespace std; template struct Dijkstra{ const T inf=numeric_limits::max(); using P=pair; int n; vector>> G; vector d; Dijkstra(int n):n(n),G(n),d(n){} void add_edge(int u,int v,T w){ G[u].emplace_back(v,w); } vector build(int s){ fill(d.begin(),d.end(),inf); d[s]=0; priority_queue,greater

> pq; pq.emplace(d[s],s); while(!pq.empty()){ P p=pq.top(); pq.pop(); int v=p.second; if (d[v]> N >> M >> X >> Y; for (int i=0;i> p[i] >> q[i]; Dijkstra D(N); for (int i=0;i> P >> Q; double d=dist(--P,--Q); D.add_edge(P,Q,d); D.add_edge(Q,P,d); } cout << fixed << setprecision(10); cout << D.build(--X)[--Y] << '\n'; }