#include int ri() { int n; scanf("%d", &n); return n; } template using pqueue_inv = std::priority_queue, std::greater >; const double DINF = 1000000000; int main() { int n = ri(); int m = ri(); int x = ri() - 1, y = ri() - 1; std::pair pts[n]; for (auto &i : pts) i.first = ri(), i.second = ri(); auto calc_dist = [&] (int i, int j) { return std::hypot(pts[i].first - pts[j].first, pts[i].second - pts[j].second); }; std::vector > hen[n]; for (int i = 0; i < m; i++) { int x = ri() - 1; int y = ri() - 1; hen[x].push_back({y, calc_dist(x, y)}); hen[y].push_back({x, calc_dist(x, y)}); } auto dijkstra = [&] (int s, int t) { std::vector dist(n, DINF); pqueue_inv > que; que.push({dist[s] = 0, s}); while (que.size()) { auto j = que.top(); que.pop(); if (j.second == t) return dist[t]; if (j.first != dist[j.second]) continue; for (auto k : hen[j.second]) { if (dist[k.first] > j.first + k.second) que.push({dist[k.first] = j.first + k.second, k.first}); } } return dist[t]; }; printf("%.11f\n", dijkstra(x, y)); return 0; }