
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
const int N = 1005;
const double inf = 1e9;
struct point
{
double x, y;
};
double pdis[N][N];
point p[N];
bool vis[N];
int n, m;
double dis[N];
double getdis(point a, point b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double prim(int st)
{
memset(dis, 0x3f, sizeof(dis));
dis[st] = 0;
double sum = 0;
for(int i = 1; i <= n; i++)
{
int k = 0;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && dis[j] < dis[k])
{
k = j;
}
}
if(k == 0) return 0;
vis[k] = 1;
sum += dis[k];
for(int j = 1; j <= n; j++)
{
int v = j;
double w = pdis[k][j];
if(!vis[v] && w < dis[v])
{
dis[v] = w;
}
}
}
return sum;
}
void Input()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
int x, y;
cin >> x >> y;
p[i].x = x;
p[i].y = y;
}
for(int i = 1; i <= n; i++)
{
for(int j = i; j <= n; j++)
{
if(j == i) pdis[i][j] = 0;
else
{
double d = getdis(p[i], p[j]);
pdis[i][j] = d;
pdis[j][i] = d;
cout << pdis[i][j] << " ";
}
}
cout << endl;
}
for(int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
pdis[u][v] = 0.00;
}
}
int main()
{
Input();
printf("%.2lf", prim(1));
return 0;
}