#include <bits/stdc++.h>
using namespace std;
typedef double DB;
const int N=210,M=N*N,INF=0x3f3f3f3f;
int n,m;
struct node {
int x,y;
}p[N];
struct node2{
int x;DB y;
};
bool operator<(node2 a,node2 b) {
return a.y>b.y;
}
struct edge{
int x,y;DB c;int pre;
}a[M];int alen,last[N];
int vis[N];
DB d[N],f[N];
DB dis(node x,node y) {
return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
void ins(int x,int y) {
alen++;a[alen]=edge{x,y,dis(p[x],p[y]),last[x]};
last[x]=alen;
}
void dij(int st) {
priority_queue<node2> q;
for(int i=1;i<=n;i++) f[i]=INF;
q.push({st,0});f[st]=0;
while(!q.empty()) {
int x=q.top().x;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int k=last[x];k;k=a[k].pre) {
int y=a[k].y;
if(f[y]>f[x]+a[k].c) {
f[y]=f[x]+a[k].c;
q.push({y,f[y]});
}
}
}
}
void astar(int st,int kth) {
if(f[st]==INF) {
puts("-1");
return ;
}
priority_queue<node2> q;
memset(vis,0,sizeof(vis));
q.push({st,0+f[st]});
while(!q.empty()) {
int x=q.top().x;
DB len=q.top().y-f[x];
q.pop();
vis[x]++;
if(vis[n]==kth) {
printf("%.2lf",len);
return ;
}
for(int k=last[x];k;k=a[k].pre) {
int y=a[k].y;
if(vis[y]<kth) q.push({y,f[y]+len+a[k].c});
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i=1;i<=m;i++) {
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);
ins(y,x);
}
dij(n);
if(f[1]==INF) puts("-1");
else astar(1,2);
}