#include using namespace std; using ll = long long; template using Pa = pair; template using vec = vector; template using vvec = vector>; int main(){ cin.tie(0); ios::sync_with_stdio(false); int N,M; cin >> N >> M; int S,T; cin >> S >> T; S--; T--; vec P(N),Q(N); for(int i=0;i> P[i] >> Q[i]; auto dist = [&](int i,int j){ double dx = P[i]-P[j],dy = Q[i]-Q[j]; return sqrt(dx*dx+dy*dy); }; vvec> g(N); for(int i=0;i> a >> b; a--; b--; double d = dist(a,b); g[a].push_back({d,b}); g[b].push_back({d,a}); } double inf = 1e9; vec D(N,inf); vec check(N,0); priority_queue,vec>,greater>> que; que.push({0.0,S}); D[S] = 0; while(!que.empty()){ auto [d,cur] = que.top(); que.pop(); if(check[cur]) continue; check[cur] = 1; for(auto& e:g[cur]){ double nd = d+e.first; if(D[e.second]>nd){ D[e.second] = nd; que.push({nd,e.second}); } } } cout << fixed << setprecision(10) << D[T] << "\n"; }