#include<cstdio>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxe=5001000;
const int maxv=100001;
struct Arc{
int u;
int v;
double w;
}E[maxe];
bool cmp(Arc e1, Arc e2){
return e1.w<e2.w;
}
int father[maxv];
int n,m,cnt=0;
int X[maxv],Y[maxv];
int findFather(int x){
if(x==father[x]) return x;
int f=findFather(father[x]);
father[x]=f;
return f;
}
double Kruskal(){
double ans=0.0;
for(int i=1;i<=n;i++){
father[i]=i;
}
sort(E,E+cnt,cmp);
int E_num=0;
for(int i=0;i<cnt;i++){
int u=E[i].u,v=E[i].v;
int fau=findFather(u),fav=findFather(v);
if(fau!=fav){
ans+=E[i].w;
fau=father[fav];
E_num++;
if(E_num==n-1) break;
}
}
if(E_num<n-1) return -1;
return ans;
}
int main(){
cin>>n>>m;
double dis;
for(int i=1;i<=n;i++){
cin>>X[i]>>Y[i];
}
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++){
dis=(double)sqrt(pow(double(X[i]-X[j]),2)+pow(double(Y[i]-Y[j]),2));
E[cnt].u=i,E[cnt].v=j;
E[cnt++].w=dis;
}
}
int x,y;
for(int i=0;i<m;i++){
cin>>x>>y;
E[cnt].u=x,E[cnt].v=y;
E[cnt++].w=0.0;
}
double ans=Kruskal();
printf("%.2f",ans);
return 0;
}