#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i, n) for(int(i) = 0; (i) < (n); (i)++) #define FOR(i, m, n) for(int(i) = (m); (i) < (n); (i)++) #define All(v) (v).begin(), (v).end() #define pb push_back #define MP(a, b) make_pair((a), (b)) using ll = long long; using pii = pair; using pll = pair; const int INF = 1 << 30; const ll LINF = 1LL << 60; const int MOD = 1e9 + 7; template struct edge { int to; T cost; edge(int t, T c) : to(t), cost(c) {} }; template using Graph = vector>>; template void dijkstra(int s, vector &d, Graph &G) { priority_queue, vector>, greater>> que; const auto INF = numeric_limits::max(); fill(All(d), INF); d[s] = 0; que.push(make_pair(0, s)); while(!que.empty()) { pair p = que.top(); que.pop(); int v = p.second; if(d[v] < p.first) continue; for(auto e : G[v]) { if(d[e.to] > d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(make_pair(d[e.to], e.to)); } } } } int main() { int N, M; cin >> N >> M; int X, Y; cin >> X >> Y; X--, Y--; vector p(N), q(N); Graph G(N); rep(i, N) { cin >> p[i] >> q[i]; } rep(i, M) { int P, Q; cin >> P >> Q; P--, Q--; double cost = sqrt((p[P] - p[Q]) * (p[P] - p[Q]) + (q[P] - q[Q]) * (q[P] - q[Q])); G[P].pb(edge(Q, cost)); G[Q].pb(edge(P, cost)); } vector dist(N); dijkstra(X, dist, G); cout << fixed << setprecision(10) << dist[Y] << endl; return 0; }