#include #include #include #include #include struct S{ double x, y, z, r; S(){} S(double x_, double y_, double z_, double r_): x(x_), y(y_), z(z_), r(r_){} static double distance(const S& a, const S & b){ double dx = a.x - b.x; double dy = a.y - b.y; double dz = a.z - b.z; return std::max(sqrt(dx * dx + dy * dy + dz * dz) - a.r - b.r, 0.0); } bool operator < (const S & s) const{ if(x != s.x){return x < s.x;} if(y != s.y){return y < s.y;} if(z != s.z){return z < s.z;} if(r != s.r){return r < s.r;} } }; int main(){ while(true){ int n; std::cin >> n; if(n == 0){break;} S ss[n]; for(int i = 0; i < n; i++){ double x, y, z, r; std::cin >> x >> y >> z >> r; ss[i] = (S(x, y, z, r)); } bool include[n]; memset(include, 0, sizeof(include)); include[0] = true; double all = 0; for(int t = 1; t < n; t++){ double m = 1e12; int mi = 0; int mj = 0; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(include[i] != include[j]){ if(m > S::distance(ss[i], ss[j])){ m = S::distance(ss[i], ss[j]); mi = i; mj = j; } } } } all += m; if(include[mi]){ include[mj] = true; }else{ include[mi] = true; } } char buffer[100]; sprintf(buffer, "%.3f", all); std::cout << buffer << std::endl; } }