#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>

using namespace std;

struct edge{
	int from;
	int to;
	double cost;
};

int a[10000];
int r[10000];

void init(){
	for(int i = 0;i < 10000;i++){
		a[i] = i;
		r[i] = 0;
	}
}

int find(int x){
	if(a[x] == x)
		return x;
	else
		return find(a[x]);
}

void unite(int x,int y){
	x = find(x);
	y = find(y);
	if(r[x] < r[y])
		a[x] = y;
	else{
		a[y] = x;
		if(r[x] == r[y])
			r[x]++;
	}
}

double dist(int x1,int y1,int x2,int y2){
	return sqrt((double)((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
}

/*int cmp(const void* a,const void* b){
	struct edge *ea = (struct edge *)a;
	struct edge *eb = (struct edge *)b;
	return eb->cost > ea->cost;
}*/

bool cmp(const edge& l,const edge& r){
	return l.cost > r.cost;
}

int main(void){
	int n, m, x[10000], y[10000], p, q, i, j, c;
	double s;
	struct edge one;
	vector<struct edge> e;
	scanf("%d%d",&n,&m);
	for(i = 0;i < n;i++)
		scanf("%d%d",&x[i],&y[i]);
	s = 0;
	for(i = 0;i < m;i++){
		scanf("%d%d",&p,&q);
		e.push_back(one);
		e[i].from = p - 1,e[i].to = q - 1;
		s += e[i].cost = dist(x[p - 1],y[p - 1],x[q - 1],y[q - 1]);
	}
	sort(e.begin(),e.end(),cmp);
//	qsort(e,m,sizeof(e[0]),cmp);
	c = 0;
	init();
	for(i = 0;i < n;i++)
		if(i == a[i]) c++;
	for(i = 0;i < m && c != 1;i++){
		if(find(e[i].from) != find(e[i].to)){
			unite(e[i].from,e[i].to);
			s -= e[i].cost;
		}
		c = 0;
		for(j = 0;j < n;j++)
			if(j == a[j]) c++;
	}
	printf("%.3f\n",s);
	return 0;
}