#pragma region head
    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    using vi = vector<int>;
    using vll = vector<ll>;
    using pi = pair<int, int>;
    using pll = pair<ll,ll>;
    template <class T> using vv = vector<vector<T>>;
    #define rep(i,n) for(int i = 0; i < (int)(n); i++)
    #define repi(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
    #define rrep(i,n) for(int i = (int)(n)-1; i >= 0; i--)
    #define rrepi(i,a,b) for(int i = (int)(b)-1; i >= (int)(a); i--)
    #define all(x) (x).begin(), (x).end()
    #define rall(x) (x).rbegin(), (x).rend()
    #define bit(n) (1LL<<(n))
    template<class T> inline bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
    template<class T> inline bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
    const int INF = 1002003004;
    const ll LINF = 1002003004005006007ll;
    struct preprocess{preprocess()
    {cin.tie(nullptr);ios::sync_with_stdio(false);cout<<fixed<<setprecision(20);}}____;
#pragma endregion head

#pragma region library
// Complexity: O(logN)
template<typename T>
struct BinaryIndexedTree{
    int sz;
    vector<T> data;
    BinaryIndexedTree(int sz): sz(sz),data(sz+1) {}
    T sum(int k){
        // [0, k]
        T res = 0;
        for(k++; k > 0; k -= k & -k) res += data[k];
        return res;
    }
    T sum(int l, int r){
        // [l, r)
        return sum(r-1)-sum(l-1);
    }
    void add(int k, T x){
        for(k++; k <= sz; k += k & -k) data[k] += x;
    }
    // sum(a1, ... , ax)>=wを満たす最小のx(0-indexed)
    // assert(all ai is non-negative)
    int lower_bound(T w){
        if(w <= 0) return 0;
        int x = 0;
        int k = 1;
        while((k<<1)<=sz) k <<= 1;
        for(;k > 0; k >>= 1){
            if(x+k <= sz && data[x+k]<w){
                w -= data[x+k];
                x += k;
            }
        }
        return x;
    }
};
// Time Complexity: O(NlogN)
template <typename T>
struct Compress{
    vector<T> xs;
    Compress(const vector<T> &v){
        add(v);
    }
    Compress(const initializer_list<vector<T>> &vs){
        for(auto v: vs) add(v);
    }
    void add(const vector<T> &v){
        xs.insert(xs.end(), v.begin(), v.end());
    }
    void add(const T &x){
        xs.emplace_back(x);
    }
    void build(){
        sort(xs.begin(), xs.end());
        // xs.erase(unique(xs.begin(), xs.end()), xs.end());
    }
    vector<int> get(const vector<T> &v) const {
        vector<int> res;
        transform(v.begin(), v.end(), back_inserter(res),[&](const T &x) {
            return lower_bound(xs.begin(), xs.end(), x) - xs.begin();
        });
        return res;
    }
    int get(const T &x) const {
        return lower_bound(xs.begin(), xs.end(), x) - xs.begin();
    }
    const T &operator[](int k) const {
        return xs[k];
    }
    int size() const {
        return (int)xs.size();
    }
};

#pragma endregion library

int main(){
    int n; cin >> n;
    vv<pair<double,double>> eq(2);
    rep(i,n){
        double a,b,c;cin >> a >> b >> c;
        eq[0].emplace_back(-a/b, c/b);
        eq[1].emplace_back(-b/a, c/a);
    }
    rep(k,2) sort(rall(eq[k]));
    vector<double> ans(2);
    int cnt = n*(n-1)/2;
    cnt = (cnt+1)/2;
    rep(k,2){
        double ng = -1e12, ok = 1e12;
        // 小数の二分探索は固定回数が安全
        rep(_, 300){
            double c = (ok+ng)/2;
            vector<double> v(n);
            rep(i,n){
                v[i] = c*eq[k][i].first+eq[k][i].second;
            }
            Compress cp(v);
            cp.build();
            vi v2 = cp.get(v);
            int rev = 0;
            BinaryIndexedTree<int> bt(n);
            rep(i,n){
                rev += i - bt.sum(v2[i]);
                bt.add(v2[i],1);
            }
            if(rev<cnt) ng = c;
            else ok = c;
        }
        ans[k] = ok;
    }
    cout << ans[0] << " " << ans[1] << '\n';
    





    
    
}

Measured memory_bytes: 5880