#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=1e5+1;
int fa[maxn],n,m,cnt;
struct edge{
int u;
int v;
double w;
}e[maxn];
double dis(int x1,int y1,int x2,int y2)
{
return (double)sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));
}
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
bool cmp(edge a,edge b)
{
if(a.w==b.w) return a.u<b.u;
return a.w<b.w;
}
long long xx[maxn],yy[maxn];
double ans=0.0;
void kruskal()
{
int t=0;
sort(e+1,e+1+n,cmp);
for(int i=1;i<=cnt;i++)
{
int eu=find(e[i].u),ev=find(e[i].v);
if(eu==ev) continue;
fa[eu]=ev;
ans+=e[i].w;
t++;
if(t==n-1) break;
}
}
int main()
{
int x,y;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>xx[i]>>yy[i];
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
double z=dis(xx[i],yy[i],xx[j],yy[j]);
e[++cnt].u=i;
e[cnt].v=j;
e[cnt].w=z;
}
for(int i=1;i<=m;i++)
{
int uu,vv;
cin>>uu>>vv;
e[++cnt].u=uu;
e[cnt].v=vv;
e[cnt].w=0.0;
}
kruskal();
printf("%.2lf",ans);
return 0;
}