#ifdef PRAGMA_COMMENT_LINKER
#pragma comment(linker, "/STACK:1999999999")
#endif
#define _CRT_SECURE_NO_WARNINGS
#define NDEBUG
#include <algorithm>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define all(v) (v).begin(), (v).end()
#define db(x) cout << #x << '=' << (x) << "\n"
#define fend(x) ((x) & ((x)+1)) - 1
#define fenu(x) (x) | ((x)+1)
#define ft first
#define len(s) s.length()
#define maxV(type) std::numeric_limits<type>::max()
#define minV(type) std::numeric_limits<type>::min()
#define mp(a, b) std::make_pair((a), (b))
#define ord(c) ((c) - 'a' + 1)
#define pob() pop_back()
#define pof() pop_front()
#define pub(s) push_back((s))
#define puf(s) push_front((s))
#define sc second
typedef double db;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
const long double EPS = 1e-15;
const long double PI = 3.14159265358979323846;
inline int lg2(ll n) { int h = 0; while ((1ll << h) < n) ++h; return h; }
struct configio {
configio() { cin.tie(nullptr); ios_base::sync_with_stdio(false); }
} cnfio;
int diff(int a, int b, int mod) {
return ((a - b) % mod + mod) % mod;
}
struct line {
line() {}
line(ld a, ld b, ld c) : a(a), b(b), c(c) {}
line(ld x1, ld y1, ld x2, ld y2) {
a = y1 - y2;
b = x2 - x1;
c = -a*x1 - b*y1;
ld norm = sqrt(a*a + b*b);
a /= norm, b /= norm, c /= norm;
}
ld dist(ld x, ld y) {
ld norm = sqrt(a*a + b*b);
return abs(a*x + b*y + c) / norm;
}
ld a, b, c;
};
const int ml = 1e4 + 1;
int n;
int maxid;
ld maxd = -1;
line lines[ml];
void max_dist(ld x, ld y) {
maxd = -1;
for (int i = 0; i < n; ++i) {
ld tmp = lines[i].dist(x, y);
if (maxd < tmp) {
maxd = tmp;
maxid = i;
}
}
}
int signum(ld val) {
if (val > EPS) return 1;
if (val < -EPS) return -1;
return 0;
}
int main() {
//freopen("input.in", "r", stdin); freopen("output.out", "w", stdout);
cin >> n;
for (int i = 0; i < n; i++) {
ld x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
lines[i] = line(x1, y1, x2, y2);
}
const int it_lim = 15000;
ld step = 1000;
ll step_lim = 100000 * 1ll * 100000;
ld x = 12, y = 21;
for (int i = 0; i < it_lim; ++i) {
max_dist(x, y);
int old_maxid = maxid;
ld old_maxd = maxd;
ld tmpx, tmpy;
int sgn = signum(lines[maxid].a * x + lines[maxid].b * y + lines[maxid].c);
while (true) {
tmpx = x - lines[old_maxid].a * step * sgn;
tmpy = y - lines[old_maxid].b * step * sgn;
max_dist(tmpx, tmpy);
if (maxd > old_maxd) {
step /= 2;
}
else {
break;
}
}
step *= 2;
if (step > step_lim) {
step = step_lim;
}
x = tmpx;
y = tmpy;
}
cout << fixed << setprecision(10);
/*max_dist(4040.9996151750674, 12003.999615175067);
cout << maxd << endl;
max_dist(x, y);
cout << maxd << endl;*/
cout << x << " " << y << " " << endl;
return 0;
}
I2lmZGVmIFBSQUdNQV9DT01NRU5UX0xJTktFUgojcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiL1NUQUNLOjE5OTk5OTk5OTkiKQojZW5kaWYKCiNkZWZpbmUgIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCiNkZWZpbmUgIE5ERUJVRwoKI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxjY3R5cGU+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RhY2s+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBhbGwodikgICAgICAgICAgICAgICAgICAodikuYmVnaW4oKSwgKHYpLmVuZCgpCiNkZWZpbmUgZGIoeCkgICAgICAgICAgICAgICAgICAgY291dCA8PCAjeCA8PCAnPScgPDwgKHgpIDw8ICJcbiIKI2RlZmluZSBmZW5kKHgpICAgICAgICAgICAgICAgICAoKHgpICYgKCh4KSsxKSkgLSAxCiNkZWZpbmUgZmVudSh4KSAgICAgICAgICAgICAgICAgKHgpIHwgKCh4KSsxKQojZGVmaW5lIGZ0ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0CiNkZWZpbmUgbGVuKHMpICAgICAgICAgICAgICAgICAgcy5sZW5ndGgoKQojZGVmaW5lIG1heFYodHlwZSkgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZT46Om1heCgpCiNkZWZpbmUgbWluVih0eXBlKSAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWluKCkKI2RlZmluZSBtcChhLCBiKSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigoYSksIChiKSkKI2RlZmluZSBvcmQoYykgICAgICAgICAgICAgICAgICAoKGMpIC0gJ2EnICsgMSkKI2RlZmluZSBwb2IoKSAgICAgICAgICAgICAgICAgICBwb3BfYmFjaygpCiNkZWZpbmUgcG9mKCkgICAgICAgICAgICAgICAgICAgcG9wX2Zyb250KCkKI2RlZmluZSBwdWIocykgICAgICAgICAgICAgICAgICBwdXNoX2JhY2soKHMpKQojZGVmaW5lIHB1ZihzKSAgICAgICAgICAgICAgICAgIHB1c2hfZnJvbnQoKHMpKQojZGVmaW5lIHNjICAgICAgICAgICAgICAgICAgICAgIHNlY29uZAoKdHlwZWRlZiBkb3VibGUgICAgICAgICAgICAgICAgICBkYjsKdHlwZWRlZiBsb25nIGRvdWJsZSAgICAgICAgICAgICBsZDsKdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgICAgICBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICAgICB1bGw7Cgpjb25zdCAgIGxvbmcgZG91YmxlCQkJCUVQUyA9IDFlLTE1Owpjb25zdCAgIGxvbmcgZG91YmxlICAgICAgICAgICAgIFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjsKCmlubGluZSBpbnQgbGcyKGxsIG4pIHsgaW50IGggPSAwOyB3aGlsZSAoKDFsbCA8PCBoKSA8IG4pICsraDsgcmV0dXJuIGg7IH0KCnN0cnVjdCBjb25maWdpbyB7Cgljb25maWdpbygpIHsgY2luLnRpZShudWxscHRyKTsgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IH0KfSBjbmZpbzsKCmludCBkaWZmKGludCBhLCBpbnQgYiwgaW50IG1vZCkgewoJcmV0dXJuICgoYSAtIGIpICUgbW9kICsgbW9kKSAlIG1vZDsKfQoKc3RydWN0IGxpbmUgewoJbGluZSgpIHt9CglsaW5lKGxkIGEsIGxkIGIsIGxkIGMpIDogYShhKSwgYihiKSwgYyhjKSB7fQoJbGluZShsZCB4MSwgbGQgeTEsIGxkIHgyLCBsZCB5MikgewoJCWEgPSB5MSAtIHkyOwoJCWIgPSB4MiAtIHgxOwoJCWMgPSAtYSp4MSAtIGIqeTE7CgkJbGQgbm9ybSA9IHNxcnQoYSphICsgYipiKTsKCQlhIC89IG5vcm0sIGIgLz0gbm9ybSwgYyAvPSBub3JtOwoJfQoJbGQgZGlzdChsZCB4LCBsZCB5KSB7CgkJbGQgbm9ybSA9IHNxcnQoYSphICsgYipiKTsKCQlyZXR1cm4gYWJzKGEqeCArIGIqeSArIGMpIC8gbm9ybTsKCX0KCWxkIGEsIGIsIGM7Cn07Cgpjb25zdCBpbnQgbWwgPSAxZTQgKyAxOwppbnQgbjsKaW50IG1heGlkOwpsZCBtYXhkID0gLTE7CmxpbmUgbGluZXNbbWxdOwoKdm9pZCBtYXhfZGlzdChsZCB4LCBsZCB5KSB7CgltYXhkID0gLTE7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCWxkIHRtcCA9IGxpbmVzW2ldLmRpc3QoeCwgeSk7CgkJaWYgKG1heGQgPCB0bXApIHsKCQkJbWF4ZCA9IHRtcDsKCQkJbWF4aWQgPSBpOwoJCX0KCX0KfQoKaW50IHNpZ251bShsZCB2YWwpIHsKCWlmICh2YWwgPiBFUFMpIHJldHVybiAxOwoJaWYgKHZhbCA8IC1FUFMpIHJldHVybiAtMTsKCXJldHVybiAwOwp9CgppbnQgbWFpbigpIHsKCS8vZnJlb3BlbigiaW5wdXQuaW4iLCAiciIsIHN0ZGluKTsgZnJlb3Blbigib3V0cHV0Lm91dCIsICJ3Iiwgc3Rkb3V0KTsKCWNpbiA+PiBuOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlsZCAgeDEsIHkxLCB4MiwgeTI7CgkJY2luID4+IHgxID4+IHkxID4+IHgyID4+IHkyOwoJCWxpbmVzW2ldID0gbGluZSh4MSwgeTEsIHgyLCB5Mik7Cgl9Cgljb25zdCBpbnQgaXRfbGltID0gMTUwMDA7CglsZCBzdGVwID0gMTAwMDsKCWxsIHN0ZXBfbGltID0gMTAwMDAwICogMWxsICogMTAwMDAwOwoJbGQgeCA9IDEyLCB5ID0gMjE7Cglmb3IgKGludCBpID0gMDsgaSA8IGl0X2xpbTsgKytpKSB7CgkJbWF4X2Rpc3QoeCwgeSk7CgkJaW50IG9sZF9tYXhpZCA9IG1heGlkOwoJCWxkIG9sZF9tYXhkID0gbWF4ZDsKCQlsZCB0bXB4LCB0bXB5OwoJCWludCBzZ24gPSBzaWdudW0obGluZXNbbWF4aWRdLmEgKiB4ICsgbGluZXNbbWF4aWRdLmIgKiB5ICsgbGluZXNbbWF4aWRdLmMpOwoJCXdoaWxlICh0cnVlKSB7CgkJCXRtcHggPSB4IC0gbGluZXNbb2xkX21heGlkXS5hICogc3RlcCAqIHNnbjsKCQkJdG1weSA9IHkgLSBsaW5lc1tvbGRfbWF4aWRdLmIgKiBzdGVwICogc2duOwoJCQltYXhfZGlzdCh0bXB4LCB0bXB5KTsKCQkJaWYgKG1heGQgPiBvbGRfbWF4ZCkgewoJCQkJc3RlcCAvPSAyOwoJCQl9CgkJCWVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJc3RlcCAqPSAyOwoJCWlmIChzdGVwID4gc3RlcF9saW0pIHsKCQkJc3RlcCA9IHN0ZXBfbGltOwoJCX0KCQl4ID0gdG1weDsKCQl5ID0gdG1weTsKCX0KCWNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDEwKTsKCS8qbWF4X2Rpc3QoNDA0MC45OTk2MTUxNzUwNjc0LCAxMjAwMy45OTk2MTUxNzUwNjcpOwoJY291dCA8PCBtYXhkIDw8IGVuZGw7CgltYXhfZGlzdCh4LCB5KTsKCWNvdXQgPDwgbWF4ZCA8PCBlbmRsOyovCgljb3V0IDw8IHggPDwgIiAiIDw8IHkgPDwgIiAiIDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==