#include <bits/stdc++.h>
using namespace std;
double ax, ay, az;
double best = 1e18;
int n;
int lim = 60;
struct point {
  int x, y, z;
  double distance(double xx, double yy, double zz) {
    return sqrt(((xx - x) * (xx - x)) + ((yy - y) * (yy - y)) +
                ((zz - z) * (zz - z)));
  }
} p[1001];
double findMax(double xx, double yy, double zz) {
  double mx = -1;
  for (int i = 0; i < n; i++) {
    mx = max(mx, p[i].distance(xx, yy, zz));
  }
  return mx;
}
double findZ(double xx, double yy) {
  double lo = -1e4, hi = 1e4, m1, m2, ans1, ans2;
  for (int i = 0; i < lim; i++) {
    m1 = lo + (hi - lo) / 3.0;
    m2 = hi - (hi - lo) / 3.0;
    ans1 = findMax(xx, yy, m1);
    ans2 = findMax(xx, yy, m2);
    if (ans1 <= ans2)
      hi = m2;
    else
      lo = m1;
  }
  az = m2;
  return ans1;
}
double findY(double xx) {
  double lo = -1e4, hi = 1e4, m1, m2, ans1, ans2;
  for (int i = 0; i < lim; i++) {
    m1 = lo + (hi - lo) / 3.0;
    m2 = hi - (hi - lo) / 3.0;
    ans1 = findZ(xx, m1);
    ans2 = findZ(xx, m2);
    if (ans1 <= ans2)
      hi = m2;
    else
      lo = m1;
  }
  ay = m2;
  return ans1;
}
double findX() {
  double lo = -1e4, hi = 1e4, m1, m2, ans1, ans2;
  for (int i = 0; i < lim; i++) {
    m1 = lo + (hi - lo) / 3.0;
    m2 = hi - (hi - lo) / 3.0;
    ans1 = findY(m1);
    ans2 = findY(m2);
    if (ans1 <= ans2)
      hi = m2;
    else
      lo = m1;
  }
  ax = m2;
  return ans1;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d %d %d", &p[i].x, &p[i].y, &p[i].z);
  }
  findX();
  printf("%.10f %.10f %.10f\n", ax, ay, az);
  return 0;
}
