#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double
#define pb push_back
#define F first
#define S second
#define make0(a) memset(a,0,sizeof(a))
#define make1(a) memset(a,-1,sizeof(a))
#define ALL(v) v.begin(),v.end()
#define pi pair <int,int>
#define pll pair <ll,ll>
#define fast_cin() ios_base::sync_with_stdio(0)

#define TRACE
#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
    cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
    const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
#else
#define trace(...)
#endif

const int mod = 1e9+7;

struct line 
{
	long double a, b, c;
	long double slope, slope_1;
	void inp()
	{
		cin >> a >> b >> c;
		slope = (-1.0 * a) / b;
		slope_1 = -1 / slope;
	}
};

bool cp(line a, line b)
{
	return a.slope < b.slope;
}

bool cp1(line a, line b)
{
	return a.slope_1 < b.slope_1;
}

void update(int i, int j, int sidx, int idx, int val, int stree[])
{
	stree[sidx] += val;
	if(i >= j)
		return;
	int m = (i + j) >> 1;
	if(idx <= m)
		update(i, m, sidx * 2, idx, val, stree);
	else
		update(m + 1, j, sidx * 2 + 1, idx, val, stree);
}

int query(int i, int j, int sidx, int ql, int qr, int stree[])
{
	// trace(i, j, ql, qr);
	if(i > qr or j < ql)
		return 0;
	if(i >= ql and j <= qr)
		return stree[sidx];
	int m = (i + j) >> 1;
	return query(i, m, sidx * 2, ql, qr, stree) + query(m + 1, j, sidx * 2 + 1, ql, qr, stree);
}

ll count_inversions(long double val[], int N)
{
	pair <long double, int> A[N + 1];
	for(int i = 1; i <= N; i++)
	{
		A[i].F = val[i];
		A[i].S = i;
	}
	sort(A + 1, A + N + 1);

	int stree[N * 4];
	make0(stree);
	ll ans = 0;
	for(int i = N; i >= 1; i--)
	{
		// trace(i, A[i].S);
		int s = query(1, N, 1, 1, A[i].S - 1, stree);
		update(1, N, 1, A[i].S, 1, stree);
		ans += s * 1ll;
		// trace(s);
	}
	return ans;
}

long double check_x(line a[], int n, long double mid)
{
	long double val[n + 1];
	for(int i = 1; i <= n; i++)
		val[i] = (a[i].c - a[i].a * mid) / a[i].b;
	// trace("here");
	ll inversions = count_inversions(val, n);
	return inversions;
}

long double check_y(line a[], int n, long double mid)
{
	long double val[n + 1];
	for(int i = 1; i <= n; i++)
		val[i] = (a[i].c - a[i].b * mid) / a[i].a;
	reverse(val + 1, val + n + 1);
	ll inversions = count_inversions(val, n);
	return inversions;
}


int main()
{
	fast_cin();
	int n;
	cin >> n;

	ll pairs = (n * (n - 1)) / 2;
	pairs /= 2;

	line a[n + 1];	
	for(int i = 1; i <= n; i++)
		a[i].inp();

	sort(a + 1, a + n + 1, cp);


	long double lo = -1 * 1e12, hi = 1e12, mid, x, y;
	for(int it = 0; it < 100; it ++)
	{

		mid = (lo + hi) / 2;
		if(check_x(a, n, mid) > pairs)
			lo = mid;
		else
			hi = mid;
	}
	sort(a + 1, a + n + 1, cp1);
	x = lo;
	lo = -1 * 1e12, hi = 1e12;
	for(int it = 0; it < 100; it ++)
	{
		mid = (lo + hi) / 2;
		if(check_y(a, n, mid) > pairs)
			lo = mid;
		else
			hi = mid;
	}
	y = (lo + hi) / 2;
	cout << fixed << setprecision(10) << x << ' ' << y << endl;
	return 0;
}

Measured memory_bytes: 5888