#include <bits/stdc++.h>
using namespace std;

#define rep(i,x,y) for(int i=(x);i<(y);++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define print(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define print(x)
#endif

const int inf=1e9;
const int64_t inf64=1e18;
const double eps=1e-9;

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec){
    os << "[";
    for (const auto &v : vec) {
    	os << v << ",";
    }
    os << "]";
    return os;
}

using i64=int64_t;

template<class T,T op(T,T)> class segtree{
public:
    int n,size_;
    vector<T> dat;
    T id_;
    segtree()=default;
    segtree(int size,T id,T initial_value){ init(size,id,initial_value); }
    void init(int size,T id,T initial_value){
        size_=size;
        id_=id;
        n=1;
        while(n<size) n*=2;
        dat.assign(2*n-1,id);
        for(int i=0; i<size; ++i) update(i,initial_value);
    }
    int size()const{ return size_; }
    void update(int k, T a) {
        k+=n-1; // leaf
        dat[k]=a;
        while(k>0) {
            k=(k-1)/2;
            dat[k]=op(dat[k*2+1],dat[k*2+2]);
        }
    }
    T at(int index){ return dat[index+n-1]; }
    void add(int k,T a){ update(k,at(k)+a); }
    T query(int a,int b) { return query(a,b,0,0,n); }
    T query(int a,int b,int k,int l,int r) {
        if(r<=a or b<=l) return id_;
        if(a<=l and r<=b) return dat[k];
        int m=(l+r)/2;
        return op(query(a,b,k*2+1,l,m),query(a,b,k*2+2,m,r));
    }
};

i64 sum(i64 x,i64 y){
    return x+y;
}

void solve(){
    i64 N;
    cin >> N;

    vector<long double> A(N),B(N),C(N);
    rep(i,0,N) cin >> A[i] >> B[i] >> C[i];

    auto ok_x=[&](long double x){
        vector<pair<long double,int>> ys1,ys2;

        rep(i,0,N) ys1.push_back(make_pair((-A[i]*x+C[i])/B[i],i));
        sort(ys1.begin(),ys1.end());

        rep(i,0,N) ys2.push_back(make_pair(A[i]/B[i],i));
        sort(ys2.begin(),ys2.end());

        vector<int> ord(N);
        rep(i,0,N) ord[ys1[i].second]=i;

        vector<int> arr(N+1);
        rep(i,0,N) arr[i]=ord[ys2[i].second];

        i64 cnt=0;
        segtree<i64,sum> seg(N,0,0);
        rep(i,0,N){
            cnt+=seg.query(arr[i],N);
            seg.update(arr[i],1);
        }

        print(x);
        print(cnt);

        return cnt>=(N*(N-1)/2+1)/2;
    };

    auto ok_y=[&](long double y){
        vector<pair<long double,int>> xs1,xs2;

        rep(i,0,N) xs1.push_back(make_pair((-B[i]*y+C[i])/A[i],i));
        sort(xs1.begin(),xs1.end());

        rep(i,0,N) xs2.push_back(make_pair(B[i]/A[i],i));
        sort(xs2.begin(),xs2.end());

        vector<int> ord(N);
        rep(i,0,N) ord[xs1[i].second]=i;

        vector<int> arr(N+1);
        rep(i,0,N) arr[i]=ord[xs2[i].second];

        i64 cnt=0;
        segtree<i64,sum> seg(N,0,0);
        rep(i,0,N){
            cnt+=seg.query(arr[i],N);
            seg.update(arr[i],1);
        }

        return cnt>=(N*(N-1)/2+1)/2;
    };

    long double ans_x,ans_y;
    
    {
        long double lb=-inf,ub=inf;
        rep(i,0,64){
            auto mid=(lb+ub)/2;
            if(ok_x(mid)) ub=mid;
            else lb=mid;
        }
        ans_x=ub;
    }

    {
        long double lb=-inf,ub=inf;
        rep(i,0,64){
            auto mid=(lb+ub)/2;
            if(ok_y(mid)) ub=mid;
            else lb=mid;
        }
        ans_y=ub;
    }

    cout << ans_x << " " << ans_y << endl;
}

int main(){
    std::cin.tie(0);
    std::ios::sync_with_stdio(false);
    cout.setf(ios::fixed);
    cout.precision(16);
    solve();
    return 0;
}


Measured memory_bytes: 8808