//这题之前想用prim()的变形,但错因是事先加边的时候,假如一条边的时候 必须要标记两个点vis[],这样有可能边还没匹配完,而结点就用完了
//所以换成了kruskal,使用并查集真的很方便哟 : )
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <memory.h>
using namespace std;
const int MAX=800;
const double INF=1<<30;
int n,m,l,que[1024][2],
u[MAX*MAX],v[MAX*MAX],map[MAX][MAX];
int fa[MAX*MAX],r[MAX*MAX];
double e[MAX*MAX],point[MAX][2];
double dis(const int &i,const int &j){
return pow(pow(point[i][0]-point[j][0],2)+
pow(point[i][1]-point[j][1],2),0.5);
}
bool cmp(const int &i,const int &j){
return e[i]<e[j];
}
int find(int x){
return fa[x]==x?x:fa[x]=(find(fa[x]));
}
void kruskalVariant(){
//bool vis[MAX*MAX];
int s,end,p,x,y;
double ans=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=0;i<l;i++) r[i]=i;
for(int i=1;i<=m;i++){
s=que[i][0];
end=que[i][1];
p=map[s][end];
x=find(u[p]);
y=find(v[p]);
fa[x]=y;
}
sort(r,r+l,cmp);
for(int i=0;i<l;i++){
p=r[i];
x=find(u[p]);
y=find(v[p]);
if(x!=y){
ans+=e[p];
fa[x]=y;
}
}
printf("%.2lf/n",ans);
return ;
}
int main()
{
//freopen("i.txt","r",stdin);
while(cin>>n){
memset(map,0,sizeof(map));
// memset(sta,0,sizeof(sta));
// for(int i=1;i<=n;i++)
// sta[i]=1;
for(int i=1;i<=n;i++)
cin>>point[i][0]>>point[i][1];
l=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)
continue;
e[l]=dis(i,j);
u[l]=i;
v[l]=j;
map[i][j]=map[j][i]=l++;
}
}
cin>>m;
for(int i=1;i<=m;i++)
cin>>que[i][0]>>que[i][1];
kruskalVariant();
}
return 0;
}