#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char buf[10000000], *ptr = buf - 1;
inline int readint(){
int n = 0;
char ch = *++ptr;
while(ch < ‘0‘ || ch > ‘9‘) ch = *++ptr;
while(ch <= ‘9‘ && ch >=‘0‘){
n = (n << 1) + (n << 3) + ch - ‘0‘;
ch = *++ptr;
}
return n;
}
typedef long long ll;
const int maxn = 1000 + 10, maxm = 500000 + 1000 + 10;
struct Edge{
int u, v;
double w;
Edge(){}
Edge(int _u, int _v, double _w): u(_u), v(_v), w(_w){}
bool operator < (const Edge &x) const {
return w < x.w;
}
}e[maxm];
int cnt = 0;
inline void add(int u, int v, double w){
e[++cnt] = Edge(u, v, w);
}
inline ll sqr(int x){
return (ll)x * x;
}
int x[maxn], y[maxn];
inline double dis(int a, int b){
return sqrt(sqr(x[a] - x[b]) + sqr(y[a] - y[b]));
}
int fa[maxn];
int Find(int a){
return a == fa[a] ? a : fa[a] = Find(fa[a]);
}
int main(){
fread(buf, sizeof(char), sizeof(buf), stdin);
int n, m;
n = readint();
m = readint();
for(int i = 1; i <= n; i++){
x[i] = readint();
y[i] = readint();
}
for(int i = 1; i <= n; i++)
for(int j = 1; j < i; j++)
add(i, j, dis(i, j));
for(int u, v, i = 1; i <= m; i++){
u = readint();
v = readint();
add(u, v, 0);
}
sort(e + 1, e + cnt + 1);
for(int i = 1; i <= n; i++) fa[i] = i;
double ans = 0.0;
for(int i = 1, k = 0; i <= cnt && k < n - 1; i++){
if(Find(e[i].v) == Find(e[i].u)) continue;
fa[Find(e[i].v)] = Find(e[i].u);
k++;
ans += e[i].w;
}
printf("%.2lf\n", ans);
return 0;
}