rt >_<。
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=0;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f?-x:x;
}
int now,head[10213111],cnt,n,m,x,y,z,X[1012313],Y[1023131];
double dis1[1021313],dis2[1023113],d,dist;
double ss(int a1,int b1,int a2,int b2) {
return double(sqrt((a1-a2)*(a1-a2)*1.00+(b1-b2)*(b1-b2)*1.00));
}
struct node{
int next,to;
double w;
}e[10231311];
void add(int u,int v,double w) {
e[++cnt].next=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
void dj() {
priority_queue<double,vector<pair<double,int> >,greater<pair<double,int> > >q;
for (int i=1;i<=n;++i) dis1[i]=99999999.99,dis2[i]=99999999.99;
dis1[1]=0;
q.push(make_pair(0.00,1));
while(!q.empty()) {
dist=q.top().first;
now=q.top().second;
q.pop();
for (int i=head[now];i;i=e[i].next) {
if (dis1[e[i].to]>dist+e[i].w) {
dis2[e[i].to]=dis1[e[i].to];
dis1[e[i].to]=dist+e[i].w;
q.push(make_pair(dis1[e[i].to],e[i].to));
q.push(make_pair(dis2[e[i].to],e[i].to));
}
else if (dis2[e[i].to]>dist+e[i].w&&dis1[e[i].to]!=dist+e[i].w){
dis2[e[i].to]=dist+e[i].w;
q.push(make_pair(dis2[e[i].to],e[i].to));
}
}
}
}
signed main(){
n=read(); m=read();
for (int i=1;i<=n;++i) {
X[i]=read();
Y[i]=read();
}
for (int i=1;i<=m;++i) {
x=read(); y=read();
d=ss(X[x],Y[x],X[y],Y[y]);
add(x,y,d);
add(y,x,d);
}
dj();
if (dis2[n]!=dis1[n]) printf("%.2lf",dis2[n]);
else cout<<-1;
return 0;
}