#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
const double eps = 1E-7, INF = 1E10;
struct TPoint {
  double x, y, z;
  TPoint(double _x = 0, double _y = 0, double _z = 0) {
    x = _x;
    y = _y;
    z = _z;
  }
};
int n;
TPoint p[MAXN], res;
inline double sqr(double x) { return x * x; }
double Find(double X, double Y, double Z) {
  double res = -INF;
  for (int i = 1; i <= n; i++)
    res = max(res, sqr(p[i].x - X) + sqr(p[i].y - Y) + sqr(p[i].z - Z));
  return res;
}
double FindZ(double X, double Y) {
  double L = -1E4, H = 1E4;
  while (H - L >= eps) {
    double M1 = L + (H - L) / 3, M2 = H - (H - L) / 3;
    double D1 = Find(X, Y, M1);
    double D2 = Find(X, Y, M2);
    if (D1 < D2)
      H = M2;
    else
      L = M1;
  }
  res.z = (H + L) / 2;
  return Find(X, Y, res.z);
}
double FindYZ(double X) {
  double L = -1E4, H = 1E4;
  while (H - L >= eps) {
    double M1 = L + (H - L) / 3, M2 = H - (H - L) / 3;
    double D1 = FindZ(X, M1);
    double D2 = FindZ(X, M2);
    if (D1 < D2)
      H = M2;
    else
      L = M1;
  }
  res.y = (H + L) / 2;
  return FindZ(X, res.y);
}
void FindXYZ() {
  double L = -1E4, H = 1E4;
  while (H - L >= eps) {
    double M1 = L + (H - L) / 3, M2 = H - (H - L) / 3;
    double D1 = FindYZ(M1);
    double D2 = FindYZ(M2);
    if (D1 < D2)
      H = M2;
    else
      L = M1;
  }
  res.x = (H + L) / 2;
  FindYZ(res.x);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) cin >> p[i].x >> p[i].y >> p[i].z;
  FindXYZ();
  printf("%.6lf %.6lf %.6lf", res.x, res.y, res.z);
}
