P2872
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int x[N],y[N];
int fa[N];
int n,m;
int tmp;
double dist(int i,int j)
{
return (double)sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j]));
}
struct Node
{
int u;
int v;
double w;
}edg[N];
int findRT(int x)
{
if(fa[x]==x) return fa[x];
return fa[x]=findRT(fa[x]);
}
bool cmp(Node x,Node y)
{
return x.w<y.w;
}
double kruskal()
{
sort(edg+1,edg+tmp+1,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
double sum=0;
int cnt=0;
for(int i=1;i<=tmp;i++)
{
if(findRT(edg[++cnt].u)!=findRT(edg[cnt].v))
{
sum+=edg[cnt].w;
if(edg[cnt].u==edg[cnt].v) continue;
fa[edg[cnt].u]=edg[cnt].v;
}
}
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++) edg[++tmp]=Node{i,j,dist(i,j)};
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
edg[++tmp]=Node{x,y,0};
}
printf("%.2lf",kruskal());
return 0;
}