#include<bits/stdc++.h>
#define inf 2147483647
#define maxn 20005
using namespace std;
int n,m,cnt;
double dis[5][maxn],w[maxn];
int h[maxn],to[maxn],nxt[maxn];
int x[maxn],y[maxn];
bool vis[maxn];
priority_queue<pair<double,int> >q;
double Dist(int x1,int y1,int x2,int y2){
return 1.0*sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void prepare(){
for(int i=0;i<=n;i++){
dis[1][i]=dis[2][i]=inf;
}
}
void addedge(int a,int b,double c){
cnt++;
w[cnt]=c;
to[cnt]=b;
nxt[cnt]=h[a];
h[a]=cnt;
}
void dijkstra(){
prepare();
dis[1][1]=0;
q.push({0,1});
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;;
vis[u]=1;
for(int i=h[u];i;i=nxt[i]){
if(!vis[to[i]]&&dis[1][to[i]]>=dis[1][u]+w[i]){
dis[2][to[i]]=dis[1][to[i]];
dis[1][to[i]]=dis[1][u]+w[i];
q.push({-dis[1][to[i]],to[i]});
}
else if(!vis[to[i]]&&dis[2][to[i]]>dis[1][u]+w[i]){
dis[2][to[i]]=dis[1][u]+w[i];
q.push({-dis[2][to[i]],to[i]});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
double w=Dist(x[u],y[u],x[v],y[v]);
addedge(u,v,w);
addedge(v,u,w);
}
dijkstra();
if(dis[2][n]==inf) cout<<-1;
else cout<<fixed<<setprecision(2)<<dis[2][n];
return 0;
}