#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; ++i)
#define fi first
#define se second
#define el "\n"
#define pb push_back
#define sz(a) (int)(a).size()
#define FILL(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
struct Point {
long double x, y, z;
};
long double dist3d(const Point &a, const Point &b){
long double dx = a.x - b.x;
long double dy = a.y - b.y;
long double dz = a.z - b.z;
return sqrtl(dx*dx + dy*dy + dz*dz);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n;
if(!(cin >> n)) return 0;
vector<Point> p(n);
FOR(i,0,n-1){
cin >> p[i].x >> p[i].y >> p[i].z;
}
Point cur;
cur.x = cur.y = cur.z = 0.0L;
FOR(i,0,n-1){
cur.x += p[i].x;
cur.y += p[i].y;
cur.z += p[i].z;
}
cur.x /= (long double)n;
cur.y /= (long double)n;
cur.z /= (long double)n;
const long double EPS = 1e-12L;
for(int it = 0; it < 10000; ++it){
long double numx = 0.0L, numy = 0.0L, numz = 0.0L, denom = 0.0L;
bool atPoint = false;
FOR(i,0,n-1){
long double d = dist3d(cur, p[i]);
if(d < EPS){
cur = p[i];
atPoint = true;
break;
}
numx += p[i].x / d;
numy += p[i].y / d;
numz += p[i].z / d;
denom += 1.0L / d;
}
if(atPoint) break;
Point nxt;
nxt.x = numx / denom;
nxt.y = numy / denom;
nxt.z = numz / denom;
long double move = dist3d(cur, nxt);
cur = nxt;
if(move < EPS) break;
}
cout.setf(ios::fixed);
cout << setprecision(4) << (double)cur.x << ' ' << (double)cur.y << ' ' << (double)cur.z;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGk9KGEpLF9iPShiKTsgaTw9X2I7ICsraSkKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGVsICJcbiIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBzeihhKSAoaW50KShhKS5zaXplKCkKI2RlZmluZSBGSUxMKGEseCkgbWVtc2V0KGEseCxzaXplb2YoYSkpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKc3RydWN0IFBvaW50IHsKbG9uZyBkb3VibGUgeCwgeSwgejsKfTsKCmxvbmcgZG91YmxlIGRpc3QzZChjb25zdCBQb2ludCAmYSwgY29uc3QgUG9pbnQgJmIpewpsb25nIGRvdWJsZSBkeCA9IGEueCAtIGIueDsKbG9uZyBkb3VibGUgZHkgPSBhLnkgLSBiLnk7CmxvbmcgZG91YmxlIGR6ID0gYS56IC0gYi56OwpyZXR1cm4gc3FydGwoZHgqZHggKyBkeSpkeSArIGR6KmR6KTsKfQoKaW50IG1haW4oKXsKaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwpjaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKCmludCBuOwppZighKGNpbiA+PiBuKSkgcmV0dXJuIDA7CnZlY3RvcjxQb2ludD4gcChuKTsKRk9SKGksMCxuLTEpewogICAgY2luID4+IHBbaV0ueCA+PiBwW2ldLnkgPj4gcFtpXS56Owp9CgpQb2ludCBjdXI7CmN1ci54ID0gY3VyLnkgPSBjdXIueiA9IDAuMEw7CkZPUihpLDAsbi0xKXsKICAgIGN1ci54ICs9IHBbaV0ueDsKICAgIGN1ci55ICs9IHBbaV0ueTsKICAgIGN1ci56ICs9IHBbaV0uejsKfQpjdXIueCAvPSAobG9uZyBkb3VibGUpbjsKY3VyLnkgLz0gKGxvbmcgZG91YmxlKW47CmN1ci56IC89IChsb25nIGRvdWJsZSluOwoKY29uc3QgbG9uZyBkb3VibGUgRVBTID0gMWUtMTJMOwoKZm9yKGludCBpdCA9IDA7IGl0IDwgMTAwMDA7ICsraXQpewogICAgbG9uZyBkb3VibGUgbnVteCA9IDAuMEwsIG51bXkgPSAwLjBMLCBudW16ID0gMC4wTCwgZGVub20gPSAwLjBMOwogICAgYm9vbCBhdFBvaW50ID0gZmFsc2U7CgogICAgRk9SKGksMCxuLTEpewogICAgICAgIGxvbmcgZG91YmxlIGQgPSBkaXN0M2QoY3VyLCBwW2ldKTsKICAgICAgICBpZihkIDwgRVBTKXsKICAgICAgICAgICAgY3VyID0gcFtpXTsKICAgICAgICAgICAgYXRQb2ludCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBudW14ICs9IHBbaV0ueCAvIGQ7CiAgICAgICAgbnVteSArPSBwW2ldLnkgLyBkOwogICAgICAgIG51bXogKz0gcFtpXS56IC8gZDsKICAgICAgICBkZW5vbSArPSAxLjBMIC8gZDsKICAgIH0KCiAgICBpZihhdFBvaW50KSBicmVhazsKCiAgICBQb2ludCBueHQ7CiAgICBueHQueCA9IG51bXggLyBkZW5vbTsKICAgIG54dC55ID0gbnVteSAvIGRlbm9tOwogICAgbnh0LnogPSBudW16IC8gZGVub207CgogICAgbG9uZyBkb3VibGUgbW92ZSA9IGRpc3QzZChjdXIsIG54dCk7CiAgICBjdXIgPSBueHQ7CiAgICBpZihtb3ZlIDwgRVBTKSBicmVhazsKfQoKY291dC5zZXRmKGlvczo6Zml4ZWQpOwpjb3V0IDw8IHNldHByZWNpc2lvbig0KSA8PCAoZG91YmxlKWN1ci54IDw8ICcgJyA8PCAoZG91YmxlKWN1ci55IDw8ICcgJyA8PCAoZG91YmxlKWN1ci56OwoKcmV0dXJuIDA7Cgp9Cg==