#include<bits/stdc++.h>
using namespace std;
#define N 205
#define db double
int n,m,k;
db dis1[N],dis2[N];
int num1[N],num2[N];
const db eps=1e-9;
struct node{
int v,nxt;
db w;
}edge[N*N];
int head[N],cnt;
void add(int u,int v,db w){
cnt++;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
struct rode{
int u;
db dis;
friend bool operator < (rode a, rode b){
return a.dis>b.dis;
}
}cur;
void dj(){
priority_queue<rode>q;
dis1[1]=eps; num1[1]=1;
cur.dis=eps; cur.u=1;
q.push(cur);
while(!q.empty()){
cur=q.top();
q.pop();
int u=cur.u,num;
db d=cur.dis;
if(d>dis2[u]) continue;
if(fabs(d-dis1[u])<eps) num=num1[u];
else num=num2[u];
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;
db dis=d+edge[i].w;
if(fabs(dis-dis1[v])<eps) num1[v]+=num;
if(fabs(dis-dis2[v])<eps) num2[v]+=num;
if(dis+eps<dis1[v]){
dis2[v]=dis1[v]; num2[v]=num1[v];
dis1[v]=dis; num1[v]=num;
cur.u=v; cur.dis=dis1[v];
q.push(cur);
}
else if(dis1[v]+eps<dis&&dis+eps<dis2[v]){
dis2[v]=dis;
num2[v]=num;
cur.u=v;
cur.dis=dis2[v];
q.push(cur);
}
}
}
}
int x[N],y[N];
db len(int tx,int ty){
return sqrt(tx*tx+ty*ty);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for(int i=1,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
db w=len(x[u]-x[v],y[u]-y[v]);
add(u,v,w); add(v,u,w);
}
for(int i=1;i<=n;i++) dis1[i]=dis2[i]=1e12;
dj();
if(num2[n]==0){
if(num1[n]<=1) printf("-1");
else printf("%.2lf",dis1[n]);
}
else printf("%.2lf",dis2[n]);
return 0;
}