#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3;
const double eps = 1e-8;
int n;
struct point {
  double x, y, z;
} p[maxn], pp;
double dis(point a, point b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) +
         (a.z - b.z) * (a.z - b.z);
}
double get(double x, double y, double z) {
  double res = 0;
  for (int i = 1; i <= n; i++) res = max(res, dis(point{x, y, z}, p[i]));
  return res;
}
double findz(double x, double y) {
  double l = -1e4, r = 1e4;
  while (r - l > eps) {
    double m1 = (l + l + r) / 3;
    double m2 = (l + r + r) / 3;
    if (get(x, y, m1) < get(x, y, m2))
      r = m2;
    else
      l = m1;
  }
  pp.z = (l + r) / 2;
  return get(x, y, (l + r) / 2);
}
double findy(double x) {
  double l = -1e4, r = 1e4;
  while (r - l > eps) {
    double m1 = (l + l + r) / 3;
    double m2 = (l + r + r) / 3;
    if (findz(x, m1) < findz(x, m2))
      r = m2;
    else
      l = m1;
  }
  pp.y = (l + r) / 2;
  return findz(x, (l + r) / 2);
}
double findx() {
  double l = -1e4, r = 1e4;
  while (r - l > eps) {
    double m1 = (l + l + r) / 3;
    double m2 = (l + r + r) / 3;
    if (findy(m1) < findy(m2))
      r = m2;
    else
      l = m1;
  }
  pp.x = (l + r) / 2;
  return findy((l + r) / 2);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
  findx();
  printf("%.9lf %.9lf %.9lf\n", pp.x, pp.y, pp.z);
  return 0;
}
