#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)(n);i++)
using namespace std;
typedef vector<int> vi;
typedef double D;

class edge{
public:
  int s,t;
  int cost;
  edge(int a,int b,int c):s(a),t(b),cost(c){}
  bool operator<(const edge &e)const{return cost<e.cost;}
};

class UF{
  vi p,r;

public:
  UF(int n):p(n,-1),r(n,0){ }

  int find(int x){ return (p[x]<0)?x:(p[x] = find(p[x])); }

  void unite(int x,int y){
    x = find(x); y = find(y);
    if(x==y)return;

    if(r[x] < r[y])p[x] = y;
    else p[y] = x;
    if(r[x] == r[y])r[x]++;
  }

  bool same(int x,int y){return find(x)==find(y);}
};

inline int dis2(int x1, int y1, int x2, int y2){
  return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}

int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int n,m;
  cin >> n >> m;
  
  vector<D> x(n),y(n);
  for(int i=0;i<n;i++)cin >> x[i] >> y[i];

  vector<edge> e;
  for(int i=0;i<m;i++){
    int a,b;
    cin >> a >> b; a--; b--;
    e.push_back(edge(a,b,dis2(x[a],y[a],x[b],y[b])));
  }

  sort(e.begin(), e.end());
  reverse(e.begin(), e.end());
  
  UF uf(n);
  D ans = 0;
  rep(i,m){
    if(uf.same(e[i].s,e[i].t))ans += sqrt(e[i].cost);
    else uf.unite(e[i].s,e[i].t);
  }
  cout << fixed << setprecision(9) << ans << endl;
}