#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<complex>
#define EQ(x,y) (fabs((x)-(y))<EPS)
#define pb push_back
#define sq(x) ((x)*(x))
using namespace std;
const double EPS=1e-8;
const double INF=1e12;
double PI=3.14159265359;
typedef complex<double> P;
namespace std{
	bool operator< (const P& a,const P& b){
		return real(a)!=real(b)?real(a)<real(b):imag(a)<imag(b);
	}
}
struct C{
	P p;double r;
	C(const P &p,double r):p(p),r(r){}
};
vector<P>crosspointCC(const C &c1,const C &c2){
	vector<P>res;
	P v=c2.p-c1.p;
	double d=abs(v);
	if(d<EPS){
		if(EQ(c1.r,c2.r)){
			res.pb(c1.p+P(c1.r,0));
		}
		return res;
	}
	vector<double>thetas;
	if(EQ(d,c1.r+c2.r)){//return res;
		thetas.pb(0);
	}else if(EQ(c1.r-c2.r,d)){//return res;
		thetas.pb(0);
	}else if(EQ(c2.r-c1.r,d)){//return res;
		thetas.pb(PI);
	}else if(d>c1.r+c2.r||d<abs(c1.r-c2.r)){
		return res;
	}else{
		//printf("%f\n",((sq(c1.r)+sq(d)-sq(c2.r))/(2.0*c1.r*d)));
		double t=acos((sq(c1.r)+sq(d)-sq(c2.r))/(2.0*c1.r*d));
		thetas.pb(t);
		thetas.pb(-t);
	//}
	//printf("%f %f \n",real(c1.p),imag(c1.p));
	for(int i=0;i<thetas.size();i++){
		res.pb(c1.p+c1.r/d*v*P(cos(thetas[i]),sin(thetas[i])));

		//printf("%f %f %f\n",thetas[i],real(res[i]),imag(res[i]));
	}}
	return res;
}
double x[10];
double y[10];
double l[10];

int main(){
	int a;
	//printf("%f %f\n",real(crosspointCC(C(P(0,0),2),C(P(1,0),2))[0]),imag(crosspointCC(C(P(0,0),2),C(P(0,1),2))[0]));
	//return 0;
	while(scanf("%d",&a),a){
		for(int i=0;i<a;i++)scanf("%lf%lf%lf",x+i,y+i,l+i);
		double left=0;
		double right=10000;
		for(int i=0;i<100;i++){
			double M=(left+right)/2;
			bool dame=false;
			vector<P> una;
			for(int j=0;j<a;j++){
				for(int k=j+1;k<a;k++){
					if(M*M>l[j]*l[j]||M*M>l[k]*l[k]||sqrt(sq(x[j]-x[k])+sq(y[j]-y[k]))>sqrt(sq(l[k])-sq(M))+sqrt(sq(l[j])-sq(M))){
						dame=true;
						continue;
					}
					//if()
					vector <P> fox=crosspointCC(C(P(x[j],y[j]),sqrt(l[j]*l[j]-M*M)),C(P(x[k],y[k]),sqrt(l[k]*l[k]-M*M)));
					//if(fox.size()==0)dame=true;
					for(int m=0;m<fox.size();m++)una.push_back(fox[m]);
				}
			}
			una.push_back(P(0.0,0.0));
			for(int j=0;j<a;j++)una.push_back(P(x[j],y[j]));
			//printf("%f :",M);
			//if(dame)printf("dame\n");
			//else printf("\n");
			if(dame){
				right=M;
				continue;
			}

			bool ok=false;
			for(int k=0;k<una.size();k++){
				bool OK=true;
				
				
			//	if(M>72.2&&M<72.4)printf("%d %f %f\n",k,real(una[k]),imag(una[k]));
				if(isnan((long double)real(una[k]))||isnan((long double)imag(una[k])))continue;
				for(int j=0;j<a;j++){
				
					if(abs(P(x[j],y[j])-una[k])*abs(P(x[j],y[j])-una[k])>EPS+(l[j])*(l[j])-M*M){
					if(M>72.2&&M<72.4){
				//		printf("%f %f %d %f %f\n",real(una[k]),imag(una[k]),j,abs(P(x[j],y[j])-una[k])*abs(P(x[j],y[j])-una[k]),(l[j])*(l[j])-M*M);
					}					
					OK=false;
					}
				}
				if(OK)ok=true;
			}
			if(ok)left=M;
			else right=M;
		}
		printf("%.9f\n",left);
	}
}