#include <bits/stdc++.h>
struct point {
  double x, y, z;
} p[100], q[10];
double ans;
int n;
double sqr(double x) { return x * x; }
double dist(point a, point b) {
  return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y) + sqr(a.z - b.z));
}
int calc(point a) {
  double dis = -1000;
  int tmp;
  for (int i = 0; i < n; ++i)
    if (dist(a, p[i]) > dis) {
      dis = dist(a, p[i]);
      tmp = i;
    }
  return tmp;
}
int main() {
  srand(32767);
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
  for (int i = 0; i < 10; ++i) {
    q[i].x = (rand() % 10000 + 1) / 100.0;
    q[i].y = (rand() % 10000 + 1) / 100.0;
    q[i].z = (rand() % 10000 + 1) / 100.0;
  }
  for (double T = 1000; T >= 1e-7; T *= 0.995)
    for (int i = 0; i < 10; ++i) {
      int t = calc(q[i]);
      double dis = dist(p[t], q[i]);
      if (dis > 1e-9) {
        q[i].x += (p[t].x - q[i].x) / dis * T;
        q[i].y += (p[t].y - q[i].y) / dis * T;
        q[i].z += (p[t].z - q[i].z) / dis * T;
      }
    }
  int tmp;
  ans = -1;
  for (int i = 0; i < 10; ++i)
    if (ans < 0 || dist(q[i], p[calc(q[i])]) < ans) {
      ans = dist(q[i], p[calc(q[i])]);
      tmp = i;
    }
  printf("%.9lf %.9lf %.9lf\n", q[tmp].x, q[tmp].y, q[tmp].z);
  return 0;
}
