#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
const double inf = 1e9+7.0;
struct node{
int v, st;
double w;
bool operator < (const node x) const{
return w > x.w;
}
};
vector<node> G[maxn];
int n, m, vis[maxn];
int cnt[maxn][maxn];
int s, t, ind;
int lst[maxn];
double dis[maxn], ans = inf, px[maxn], py[maxn];
double calc(int u, int v){
return sqrt((px[u]-px[v])*(px[u]-px[v])+(py[u]-py[v])*(py[u]-py[v]));
}
void dij(int s){
priority_queue<node> q;
memset(vis, 0, sizeof(vis));
for (int i=1; i<=n; i++) dis[i] = inf;
dis[s] = 0; vis[s] = 1; q.push({s, 0, dis[s]});
while (!q.empty()){
node u = q.top(); q.pop();
int ut = u.v;
vis[ut] = 1;
double w = u.w;
for (int i=0; i<G[ut].size(); i++){
int vt = G[ut][i].v, st = cnt[ut][vt];
double w = G[ut][i].w;
if (dis[vt] > dis[ut] + w && st != 1){
dis[vt] = dis[ut] + w;
if (!vis[vt]) q.push({vt, 0, dis[vt]});
}
}
}
}
void refind(int x){
if (x == s) return;
for (int i=0; i<G[x].size(); i++){
int vt = G[x][i].v;
double w = G[x][i].w;
if (dis[vt] + w == dis[x]){
lst[++ind] = i;
refind(vt);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for (int i=1; i<=n; i++) cin>>px[i]>>py[i];
for (int i=1; i<=m; i++){
int u, v; cin>>u>>v;
G[u].push_back({v, 0, calc(u, v)});
G[v].push_back({u, 0, calc(u, v)});
}
s = 1; t = n;
dij(s);
refind(t);
int pt1 = t, pt2;
if (ind == 0) {
cout<<-1;
return 0;
}
for (int i=1; i<=ind; i++){
pt2 = G[pt1][lst[i]].v;
G[pt1][lst[i]].st = 1;
cnt[pt1][pt2] = cnt[pt2][pt1] = 1;
dij(s);
ans = min(ans, dis[t]);
cnt[pt1][pt2] = cnt[pt2][pt1] = 0;
pt1 = pt2;
}
printf("%.2f", ans);
}