#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y, z;
  point(double a = 0, double b = 0, double c = 0) {
    x = a;
    y = b;
    z = c;
  }
  void input() { scanf("%lf%lf%lf", &x, &y, &z); }
};
point ps[110];
int n;
const double eps = 1e-6;
inline double gdis(point &p1, point &p2) {
  return (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y) +
         (p2.z - p1.z) * (p2.z - p1.z);
}
double calc(point &p) {
  double ans = 0;
  for (int i = 0; i < n; i++) {
    double ret = gdis(p, ps[i]);
    if (ans < ret) ans = ret;
  }
  return ans;
}
double trisz(double x, double y, point &ans) {
  double l = -1e4, r = 1e4;
  point p1(x, y, 0), p2(x, y, 0);
  while (r - l > eps) {
    double m1 = (2 * l + r) / 3;
    double m2 = (l + 2 * r) / 3;
    p1.z = m1;
    p2.z = m2;
    if (calc(p1) < calc(p2)) {
      ans = p1;
      r = m2;
    } else {
      ans = p2;
      l = m1;
    }
  }
  return calc(ans);
}
double trisy(double x, point &ans) {
  double l = -1e4, r = 1e4;
  point p1, p2;
  double v1, v2, v;
  while (r - l > eps) {
    double m1 = (2 * l + r) / 3;
    double m2 = (l + 2 * r) / 3;
    v1 = trisz(x, m1, p1);
    v2 = trisz(x, m2, p2);
    if (v1 < v2) {
      v = v1;
      r = m2;
      ans = p1;
    } else {
      v = v2;
      l = m1;
      ans = p2;
    }
  }
  return v;
}
void trisx(point &ans) {
  double l = -1e4, r = 1e4;
  point p1, p2;
  while (r - l > eps) {
    double m1 = (2 * l + r) / 3;
    double m2 = (l + 2 * r) / 3;
    if (trisy(m1, p1) < trisy(m2, p2)) {
      r = m2;
      ans = p1;
    } else {
      l = m1;
      ans = p2;
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    ps[i].input();
  }
  point p;
  trisx(p);
  printf("%.10lf %.10lf %.10lf\n", p.x, p.y, p.z);
  return 0;
}
