#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using P = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vll = vector<ll>;
using vvll = vector<vector<ll>>;
const ld eps = 1e-9;
const ll MOD = 1000000007;
const int INF = 1000000000;
const ll LINF = 1ll<<50;
template<typename T>
void printv(const vector<T>& s) {
  for(int i=0;i<(int)(s.size());++i) {
    cout << s[i];
    if(i == (int)(s.size())-1) cout << endl;
    else cout << " ";
  }
}
template<typename T1, typename T2>
ostream& operator<<(ostream &os, const pair<T1, T2> p) {
  os << p.first << ":" << p.second;
  return os;
}
int n;
vll x, y, l;
double dist(double x1, double y1, double x2, double y2) {
  return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
double area(double a, double b, double c) {
  double s = (a + b + c) / 2;
  return sqrt(s * (s-a) * (s-b) * (s-c));
}
bool triangle(double a, double b, double c) {
  return a + b > c - eps && b + c > a - eps && c + a > b - eps;
}
double solve1() {
  double res = 0.0;
  for(int i=0;i<n;++i) {
    bool ok = true;
    for(int j=0;j<n;++j) {
      if(i == j) continue;
      ok &= l[j] * l[j] + eps > l[i] * l[i] + dist(x[i], y[i], x[j], y[j]) * dist(x[i], y[i], x[j], y[j]);
    }
    if(ok) res = max(res, (double)l[i]);
  }
  return res;
}
double solve2() {
  double res = 0.0;
  for(int i=0;i<n;++i) {
    for(int j=i+1;j<n;++j) {
      double d = dist(x[i], y[i], x[j], y[j]);
      if(!triangle(d, l[i], l[j])) continue;
      double s = area(d, l[i], l[j]);
      double h = s * 2 / d;
      double tmp = sqrt(l[i] * l[i] - h * h);
      complex<double> p1(x[i], y[i]), p2(x[j], y[j]), hoko(tmp/d, 0.0);
      complex<double> p3 = p1 + hoko * (p2 - p1);
      bool ok = true;
      for(int k=0;k<n;++k) {
        if(i == k || j == k) continue;
        double d2 = dist(x[k], y[k], p3.real(), p3.imag());
        ok &= l[k] + eps > sqrt(h * h + d2 * d2);
      }
      if(ok) res = max(res, h);
    }
  }
  return res;
}
double solve3() {
  double res = 0.0;
  for(int i=0;i<n;++i) {
    for(int j=i+1;j<n;++j) {
      for(int k=j+1;k<n;++k) {
        double a1 = l[i] * l[i] - x[i] * x[i] - y[i] * y[i];
        double a2 = l[j] * l[j] - x[j] * x[j] - y[j] * y[j];
        double a3 = l[k] * l[k] - x[k] * x[k] - y[k] * y[k];
        double a21 = -(a2 - a1) / 2;
        double a31 = -(a3 - a1) / 2;
        double d = (x[j] - x[i]) * (y[k] - y[i]) - (x[k] - x[i]) * (y[j] - y[i]);
        if(abs(d) < eps) continue;
        double b = (a21 * (y[k] - y[i]) - a31 * (y[j] - y[i])) / d;
        double c = (a31 * (x[j] - x[i]) - a21 * (x[k] - x[i])) / d;
        double tmp = l[i] * l[i] - (x[i] - b) * (x[i] - b) - (y[i] - c) * (y[i] - c);
        if(tmp < eps) continue;
        double z = sqrt(tmp);
        bool ok = true;
        for(int p=0;p<n;++p) {
          if(p == i || p == j || p == k) continue;
          double d2 = dist(x[p], y[p], b, c);
          ok &= l[p] + eps > sqrt(z * z + d2 * d2);
        }
        if(ok) res = max(res, z);
      }
    }
  }
  return res;
}
void solve() {
  x.clear();
  x.resize(n);
  y.clear();
  y.resize(n);
  l.clear();
  l.resize(n);
  for(int i=0;i<n;++i) {
    cin >> x[i] >> y[i] >> l[i];
  }
  cout << max(solve1(), max(solve2() , solve3())) << endl;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  while(1) {
    cin >> n;
    if(n == 0) break;
    solve();
  }
}



Measured memory_bytes: 3292