#include<cstdio>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=1e3+5;
int n,m,now;
double ans;
struct node{
double x,y;
}t[maxn];
int cnt;
int head[maxn],to[maxn<<1],pre[maxn<<1];
void link(int a,int b)
{
to[++cnt]=b;
pre[cnt]=head[a];
head[a]=cnt;
}
double dis[maxn];
int vis[maxn];
void prim(){
for(int i=1;i<=n;i++)
{
if(i==now) continue;
dis[i]=0x7fffffff;
}
double x2=t[now].x,y2=t[now].y;
for(int i=1;i<=n;i++)
{
if(vis[i]) continue;
else{
double x1=t[i].x,y1=t[i].y;
double tmp=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
dis[i]=min(dis[i],tmp);
}
}
for(int tot=m+1;tot<n;tot++)
{
vis[now]=1;
int minn=0x7fffffff;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]<minn)
{
minn=dis[i];
now=i;
}
}
ans+=minn;
x2=t[now].x,y2=t[now].y;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
double x1=t[i].x,y1=t[i].y;
double tmp=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
dis[i]=min(dis[i],tmp);
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>t[i].x>>t[i].y;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
link(a,b);
link(b,a);
vis[a]=1,vis[b]=1;
now=a;
}
prim();
printf("%.2lf",ans);
return 0;
}