#include <cassert>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

struct pnt
{
  long double x, y;
  pnt( long double _x = 0.0, long double _y = 0.0 ) : x(_x), y(_y) {}
  pnt operator + ( pnt b ) { return pnt(x + b.x, y + b.y); }
  pnt operator - ( pnt b ) { return pnt(x - b.x, y - b.y); }
  pnt operator * ( long double k ) { return pnt(x * k, y * k); }
  long double d2() { return x * x + y * y; }
};

const long double eps = 1e-12;

void cross( pnt p1, long double r1, pnt p2, long double r2, vector <pnt> &res )
{
  long double a = 2 * (p2.x - p1.x);
  long double b = 2 * (p2.y - p1.y);
  long double c = p1.x * p1.x - p2.x * p2.x + p1.y * p1.y - p2.y * p2.y + r2 * r2 - r1 * r1;
  long double d = sqrtl(a * a + b * b);
  a /= d, b /= d, c /= d;
  d = p1.x * a + p1.y * b + c;
  long double h = r1 * r1 - d * d;
  if (h < -eps)
    return;
  if (h < eps)
    h = 0.0;
  h = sqrtl(h);
  res.push_back(p1 - pnt(a, b) * d + pnt(-b, a) * h);
  res.push_back(p1 - pnt(a, b) * d - pnt(-b, a) * h);
}

int main()
{
  assert(freopen("hadron.in", "r", stdin) == stdin);
  assert(freopen("hadron.out", "w", stdout) == stdout);

  int n;
  assert(scanf("%d", &n) == 1);
  pnt *p = new pnt[n];
  int *r = new int[n];
  long double minR = 0.0, maxR = 1e4;
  for (int i = 0; i < n; i++)
  {
    int tx, ty;
    assert(scanf("%d%d%d", &tx, &ty, &r[i]) == 3);
    p[i] = pnt(tx, ty);
    minR = max(minR, r[i] + 0.1L);
  }
  pnt ans;
  for (int cnt = 0; cnt < 500; cnt++)
  {
    long double curR = 0.5 * (minR + maxR);
    vector <pnt> pnts;
    for (int i = 0; i < n; i++)
      pnts.push_back(p[i] + pnt(sqrtl(curR * curR - r[i] * r[i])));
    for (int i = 0; i < n; i++)
      for (int j = i + 1; j < n; j++)
        cross(p[i], sqrtl(curR * curR - r[i] * r[i]), p[j], sqrtl(curR * curR - r[j] * r[j]), pnts);
    bool found = false;
    for (int i = 0; i < (int)pnts.size(); i++)
    {
      bool good = true;
      for (int j = 0; j < n; j++)
        if ((pnts[i] - p[j]).d2() > curR * curR - r[j] * r[j] + eps)
          good = false, j = n;
      if (good)
      {
        found = true;
        ans = pnts[i];
        break;
      }
    }
    if (found)
      maxR = curR;
    else
      minR = curR;
  }
  assert(printf("%.20lf %.20lf %.20lf\n", (double)ans.x, (double)ans.y, (double)minR) >= 0);

  delete[] p, delete[] r;
  return 0;
}

