#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-7;
struct point3 {
  double x, y, z;
  point3() {}
  point3(double a, double b, double c) : x(a), y(b), z(c) {}
  point3 operator-(const point3 &p) {
    return point3(x - p.x, y - p.y, z - p.z);
  }
  double len() { return x * x + y * y + z * z; }
} p[105];
int n;
double F(point3 pt) {
  double maxs = 0, tp;
  for (int i = 0; i < n; i++) {
    tp = (pt - p[i]).len();
    if (tp > maxs) maxs = tp;
  }
  return maxs;
}
double Z(double x, double y, double &z) {
  double l = -10000, r = 10000, mid1, mid2, tp1, tp2, d;
  while (r - l > eps) {
    d = (r - l) / 3;
    mid1 = l + d;
    tp1 = F(point3(x, y, mid1));
    mid2 = r - d;
    tp2 = F(point3(x, y, mid2));
    if (tp1 > tp2) {
      l = mid1;
    } else {
      r = mid2;
    }
  }
  z = mid1;
  return tp1;
}
double Y(double x, double &y, double &z) {
  double l = -10000, r = 10000, mid1, mid2, tp1, tp2, d;
  while (r - l > eps) {
    d = (r - l) / 3;
    mid1 = l + d;
    tp1 = Z(x, mid1, z);
    mid2 = r - d;
    tp2 = Z(x, mid2, z);
    if (tp1 > tp2) {
      l = mid1;
    } else {
      r = mid2;
    }
  }
  y = mid1;
  return tp1;
}
void X() {
  double l = -10000, r = 10000, mid1, mid2, tp1, tp2, d, y, z;
  while (r - l > eps) {
    d = (r - l) / 3;
    mid1 = l + d;
    tp1 = Y(mid1, y, z);
    mid2 = r - d;
    tp2 = Y(mid2, y, z);
    if (tp1 > tp2) {
      l = mid1;
    } else {
      r = mid2;
    }
  }
  printf("%.8f %.8f %.8f\n", mid1, y, z);
}
int main() {
  int i;
  while (~scanf("%d", &n)) {
    for (i = 0; i < n; i++) {
      scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
    }
    X();
  }
  return 0;
}
