#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>

using namespace std;

int par[10050];
int N,M;

struct edge
{
    int u,v;
    double dis;
}es[10050];

struct zb
{
    int x1,y1;
}z[10050];

void init()
{
    for(int i=0;i<10050;i++)
    {
        par[i]=i;
    }
}

int findroot(int x)
{
    if(par[x]==x)
        return x;
    else
        return par[x]=findroot(par[x]);
}

void unite(int x,int y)
{
    int xx=findroot(x);
    int yy=findroot(y);
    if(xx==yy)
        return;
    else
        par[xx]=yy;
}

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

bool cmp(edge a,edge b)
{
    return a.dis>b.dis;
}

double kruskal()
{
    sort(es,es+M,cmp);
    init();
    double res=0;
    for(int i=0;i<M;i++)
    {
        edge e=es[i];
        if(same(e.u,e.v)==0)
        {
            unite(e.u,e.v);
            res+=e.dis;
        }
    }
    return res;
}

int main()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        scanf("%d%d",&z[i].x1,&z[i].y1);
    }
    double sum=0;
    for(int i=0;i<M;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        double d=sqrt((z[a].x1-z[b].x1)*(z[a].x1-z[b].x1)+(z[a].y1-z[b].y1)*(z[a].y1-z[b].y1));
        es[i].u=a;
        es[i].v=b;
        es[i].dis=d;
        sum+=d;
    }
    printf("%f\n",sum-kruskal());
    return 0;
}

