#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
const int N=1010,M = 10010;
int n,m,s,f;
int head[N],nextt[M*2],to[M*2];
double len[M*2];
int cnt;
double dis[N][2],x[N],y[N];
double num[N][2];
int vis[N][2];
#define pow2(x) (x)*(x)
#define disof(i,j) sqrt(pow2(x[i]-x[j])+pow2(y[i]-y[j]))
void add(int u,int v,double w){
to[cnt]=v,len[cnt]=w,nextt[cnt]=head[u],head[u]=cnt;
cnt++;
}
struct node{
int to;
double dis;
int kind;
bool operator <(const node& a)const{
return a.dis<dis;
}
};
void dijstra(){
for(int i = 1;i<=n;++i) dis[n][0] = dis[n][1] = 1e9;
dis[s][0]=0,num[s][0]=1;
priority_queue<node>q;
q.push({s,dis[s][0],0});
while(q.size()){
int u=q.top().to;int kind=q.top().kind;q.pop();
if(vis[u][kind])continue;
vis[u][kind]=1;
for(int i=head[u];i;i=nextt[i]){
int v=to[i];
if(dis[v][0]>dis[u][kind]+len[i]){
dis[v][1]=dis[v][0];num[v][1]=num[v][0];
q.push({v,dis[v][1],1});
dis[v][0]=dis[u][kind]+len[i];
num[v][0]=num[u][kind];
q.push({v,dis[v][0],0});
}
else if(dis[v][0]==dis[u][kind]+len[i]){
num[v][0]+=num[u][kind];
}
else if(dis[v][1]>dis[u][kind]+len[i]){
dis[v][1]=dis[u][kind]+len[i];
num[v][1]=num[u][kind];
q.push({v,dis[v][1],1});
}
else if(dis[v][1]==dis[u][kind]+len[i]){
num[v][1]+=num[u][kind];
}
}
}
}
int main(){
cin>>n>>m;
for(int i = 1;i<=n;++i) cin>>x[i]>>y[i];
cnt=1;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
if(u==v)continue;
add(u,v,disof(u,v));
add(v,u,disof(u,v));
}
s=1,f=n;
dijstra();
cout<<dis[f][1];
}