#include<bits/stdc++.h>
using namespace std;
typedef complex<double> P;
double eps=1e-8;
struct S{
  P s,t;
  S(P s=P(),P t=P()): s(s),t(t) {}
};
struct C{
  P p;
  double r;
  C(P p=P(),double r=0):p(p),r(r){}
};
 
 
bool eq(double a,double b){
  return (-eps<a-b&&a-b<eps);
}
 
double Sqrt(double a){
  if(a<0)return 0;
  return sqrt(a);
}

bool isIntersect(C a,C b){
  double k=abs(a.p-b.p);
  return (a.r+b.r>=k-eps&& abs(a.r-b.r)<=k+eps);
}

P crossPoint(C a,C b){
  P base=b.p-a.p;
  double k=(-b.r*b.r+a.r*a.r+norm(base));
  double w=k/(2.0*abs(base)),h=Sqrt(a.r*a.r-w*w);
  base/=abs(base);
  return a.p+base*P(w,h);
}


bool isIntersect(vector<C> &vec){
  vector<P> t;
  for(int i=0;i<(int)vec.size();i++){
    t.push_back(vec[i].p);
    for(int j=0;j<i;j++){
      if(isIntersect(vec[i],vec[j])){
        t.push_back(crossPoint(vec[i],vec[j]));
        t.push_back(crossPoint(vec[j],vec[i]));
      }
    }
  }
  for(int i=0;i<(int)t.size();i++){
    bool flg=true;
    for(int j=0;j<(int)vec.size();j++)
      if(vec[j].r*vec[j].r+eps<norm(vec[j].p-t[i]))flg=false;
    if(flg)return true;
  }
  return false;
}

int n;
vector<P> t;
vector<double> u;

double check(double M){
  vector<C> nt(n);
  for(int i=0;i<n;i++){
    nt[i].p=t[i];
    nt[i].r=Sqrt(u[i]*u[i]-M*M);
  }
  return isIntersect(nt);
}

double solve(){
  double L=0,R=1e8,M;
  for(int i=0;i<n;i++)R=min(R,u[i]);
  
  for(int i=0;i<1000;i++){
    M=(L+R)/2;
    if(check(M))L=M;
    else R=M;
  }
  
  return L;
}

int main(){
  while(1){
    cin>>n;
    if(n==0)break;
    t.clear();t.resize(n);
    u.clear();u.resize(n);
    for(int i=0;i<n;i++){
      double x,y;
      cin>>x>>y>>u[i];
      t[i]=P(x,y);
    }
    printf("%.10f\n",solve());
  }
}