#include <iostream>#include <stdio.h>#include <math.h>#include <string.h>using namespace std;#define N 102struct node{ double x,y,z; double r; double dis(node &b) { return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z))-r-b.r; }}rc[N];double map[N][N];double Max,Min;int n;bool b[N];double Prim(){double sum=0; int t=n-1; int i,k; memset(b,0,sizeof(b)); b[0]=1; while(t--) { Min=Max;for(i=1;i<n;i++) if(!b[i]&&map[0][i]<=Min) { Min=map[0][i]; k=i; } b[k]=1; sum+=Min;for(i=1;i<n;i++) if(!b[i]&&map[0][i]>map[k][i])map[0][i]=map[k][i]; } return sum;}int main(){ int i,k;while(scanf("%d",&n),n) { for(i=0;i<n;i++) scanf("%lf %lf %lf %lf",&rc[i].x,&rc[i].y,&rc[i].z,&rc[i].r); double temp; for(i=0;i<n;i++) for(k=i+1;k<n;k++) { temp=rc[i].dis(rc[k]); if(temp<=0) map[i][k]=0; else map[i][k]=temp; Max=Max>map[i][k]?Max:map[i][k]; map[k][i]=map[i][k]; } printf("%.3lfn",Prim());}return 0;}