#include <bits/stdc++.h>
using namespace std;
template <typename T>
T abs(T a) {
  return a < 0 ? -a : a;
}
template <typename T>
T sqr(T a) {
  return a * a;
}
const int INF = (int)1e9;
const long double EPS = 1e-9;
const long double PI = 3.1415926535897932384626433832795;
struct pt3 {
  long double first, second, Z;
  pt3(const long double& cX = 0, const long double& cY = 0,
      const long double& cZ = 0)
      : first(cX), second(cY), Z(cZ) {}
};
inline long double dist2(const pt3& a, const pt3& b) {
  return sqr(a.first - b.first) + sqr(a.second - b.second) + sqr(a.Z - b.Z);
}
int n;
pt3 p[200];
long double minC[3], maxC[3];
pt3 c;
const int ITER_COUNT = 50;
inline long double tsearch(int);
inline long double setC(int idx, const long double& v) {
  switch (idx) {
    case 0:
      c.first = v;
      break;
    case 1:
      c.second = v;
      break;
    case 2:
      c.Z = v;
      break;
    default:
      throw;
  }
  return tsearch(idx + 1);
}
inline long double tsearch(int idx) {
  if (idx == 3) {
    long double mx = 0;
    for (int i = 0; i < int(n); ++i) mx = max(mx, dist2(p[i], c));
    return mx;
  }
  long double lf = minC[idx];
  long double rg = maxC[idx];
  for (int i = 0; i < int(ITER_COUNT); ++i) {
    long double d = (rg - lf) / 3;
    long double ml = lf + d;
    long double mr = rg - d;
    long double fl = setC(idx, ml);
    long double fr = setC(idx, mr);
    if (fl > fr)
      lf = ml;
    else
      rg = mr;
  }
  return setC(idx, lf);
}
int main() {
  cin >> n;
  for (int i = 0; i < int(3); ++i) {
    minC[i] = 1e100;
    maxC[i] = -1e100;
  }
  for (int i = 0; i < int(n); ++i) {
    cin >> p[i].first >> p[i].second >> p[i].Z;
    minC[0] = min(minC[0], p[i].first);
    minC[1] = min(minC[1], p[i].second);
    minC[2] = min(minC[2], p[i].Z);
    maxC[0] = max(maxC[0], p[i].first);
    maxC[1] = max(maxC[1], p[i].second);
    maxC[2] = max(maxC[2], p[i].Z);
  }
  tsearch(0);
  cout.precision(10);
  cout << fixed << c.first << " " << c.second << " " << c.Z << endl;
  return 0;
}
