#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
double sum;
struct edge{
int a,b;
double v;
edge(){}
edge(int A,int B,double V){
a=A;b=B;v=V;
}
bool operator < (const edge & a) const{
return v>a.v;
}
};
vector<edge> G[maxn];
priority_queue<edge> Q;
bool vis[maxn];
int P,R;
void prim()
{
int cou=0;
for(int i=0;i<G[1].size();i++)
Q.push(G[1][i]);
vis[1]=true;
while(!Q.empty()){
edge W=Q.top();
Q.pop();
if(vis[W.b])
continue;
vis[W.b]=true;
cou++;
sum+=W.v;
if(cou==P-1)
return;
for(int i=0;i<G[W.b].size();i++)
Q.push(G[W.b][i]);
}
}
void init(){
for(int i=1;i<=P;i++)
G[i].clear();
while(!Q.empty())
Q.pop();
memset(vis,0,sizeof(vis));
sum=0;
}
struct point{
double x,z,y,r;
point(){}
point(double xx,double yy,double zz,double rr){
x=xx,y=yy,z=zz,r=rr;
}
}Poi[maxn];
int main()
{
while(cin>>P && P)
init();
for(int i=1;i<=P;i++){
double x,y,z,r;
cin>>x>>y>>z>>r;
Poi[i]=point(x,y,z,r);
}
for(int i=1;i<=P-1;i++)
for(int j=i+1;j<=P;j++){
double dis=sqrt((Poi[i].x-Poi[j].x)*(Poi[i].x-Poi[j].x)+(Poi[i].y-Poi[j].y)*(Poi[i].y-Poi[j].y)+(Poi[i].z-Poi[j].z)*(Poi[i].z-Poi[j].z))-Poi[i].r-Poi[j].r;
if(dis<0) dis=0;
G[i].push_back(edge(i,j,dis));
G[j].push_back(edge(j,i,dis));
}
prim();
printf("%.3lf\n",sum);
getchar();
}
return 0;
}