#include<bits/stdc++.h>
#define map mapp
#define prev prevvvvvvvv
using namespace std;
const int N=400,inf=0x3f3f3f3f;
priority_queue<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int> > >q;
int n,m,x[N+10],y[N+10],t1,t2,to[N+10],nxt[N+10],head[N+10],tot,prev[N+10];
double f[N+10],val[N+10],ans=inf*2;
double calc(int a,int b,int c,int d)
{
return (double)sqrt(double(a-c)*double(a-c)+double(b-d)*double(b-d));
}
void add(int a,int b)
{
double z=calc(x[a],y[a],x[b],y[b]);
to[++tot]=b;
val[tot]=z;
nxt[tot]=head[a];
head[a]=tot;
}
void dijkstra(int a,int b)
{
for(int i=1;i<=n;i++) f[i]=inf;
f[1]=0;
q.push(make_pair(0,1));
while(q.size())
{
double valu=q.top().first;
int num=q.top().second;
q.pop();
if(valu!=f[num]) continue;
for(int j=head[num];j;j=nxt[j])
{
int v=to[j];
if((num==a&&v==b)||(num==b&&v==a)) continue;
if(f[v]<=valu+val[j]) continue;
if(a==-1&&b==-1) prev[v]=num;
f[v]=valu+val[j];
q.push(make_pair(f[v],v));
}
}
}
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;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
add(t1,t2);
add(t2,t1);
}
dijkstra(-1,-1);
for(int i=n;i!=1;i=prev[i])
{
dijkstra(i,prev[i]);
ans=min(ans,f[n]);
}
if(ans>=inf) puts("-1");
else printf("%.2lf",ans);
}