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

#define REP(i, a) for(int64 i = 0; i < (a);i++)
#define FOR(i, a, b) for(int64 i = (a); i < (b); i++)
#define INF (int64)1e9
#define INF_LL (int64)1e18
#define all(x) x.begin(),x.end()
#define fs first
#define sc second

using int32 = int32_t;
using int64 = int64_t;
using PII = pair<int32, int32>;
using PLL = pair<int64, int64>;

template<typename A, typename B> inline void chmin(A &a, B b) { if (a > b) a = b;}
template<typename A, typename B> inline void chmax(A &a, B b) { if (a > b) a = b;}

template<typename CommutativeMonoid>
class FenwickTree{
public:
  using value_structure = CommutativeMonoid;
  using value_type = typename CommutativeMonoid::value_type;
  using size_type = ::std::size_t;

private:
  ::std::vector<value_type> tree;
  size_type N;

  static value_type calc(const value_type& a, const value_type& b){
    return value_structure::operation(a, b);
  }

public:
  FenwickTree(){}
  FenwickTree(const size_type& N):N(N+10), tree(N+11, value_structure::identity()){}
  FenwickTree(const FenwickTree& bit):tree(bit.tree), N(bit.N){}

  void update(size_type k, const value_type& diff){ // update k in [1, N]
    for(;k <= N;k += k & -k){
      tree[k] = calc(tree[k], diff);
    }
  }

  value_type query(size_type k) const { // sum of [1, k]
    value_type res = value_structure::identity();
    for(;k > 0;k -= k & -k){
      res = calc(res, tree[k]);
    }
    return res;
  }

  void updatez(size_type k, value_type v){ // 0-indexed
    update(k+1, v);
  }

  value_type queryz(size_type k) const { // [0, k)
    return query(k);
  }

  size_type search(const std::function<bool(value_type)>& f) const { // Find k :[0, k) -> True, [0, k-1) -> False
    if(f(value_structure::identity()))
      return 0;
    if(!f(query(N)))
      return N+1;
    value_type x = value_structure::identity();
    size_type k = 1, idx = 0;
    while(k <= N) k <<= 1;
    k >>= 1;
    for(;k > 0;k >>= 1){
      if((idx|k) <= N && !f(tree[idx|k]+x))
        x = calc(x, tree[idx |= x]);
    }
    return idx+1;
  }

  size_type size() const {return N;}
};

class v_monoid {
public:
  using value_type = int64;
  static const value_type identity() { return 0; }
  static const value_type operation(const value_type& a, const value_type& b) {
    return a + b;
  }
};

using ld = long double;

int64 N;
vector<ld> A, B, C;
vector<int64> t;

long double calc(const vector<ld>& a, const vector<ld>& b, const vector<ld>& c) {
  ld l = -INF_LL, r = INF_LL, m;

  vector<ld> tt(N);
  REP(i, N) {
    tt[i] = -a[i]/b[i];
  }
  vector<ld> zip(tt);
  sort(all(zip));
  zip.erase(unique(all(zip)), zip.end());
  vector<int> dir(N);
  REP(i, N) {
    t[i] = lower_bound(all(zip), tt[i]) - zip.begin();
    if (zip[t[i]] < 0) {
      dir[i] = 0;
    } else {
      dir[i] = 1;
    }
  }
  auto ok = [&](const ld& y) {
    using PDI = pair<ld, int>;
    vector<PDI> xs(N);
    FenwickTree<v_monoid> bit(t.size());
    REP(i, N) {
      xs[i] = PDI((c[i]-b[i]*y)/a[i], i);
    }
    sort(all(xs));
    int64 dcnt[2] = {};
    int64 cnt = 0;
//    cout << y << ": ";
    for (auto& xv : xs) {
      int64 idx = xv.sc;
      int64 di = dir[idx];
//      cout << "(" << xv.sc << " " << t[xv.sc] << " " << di << ") ";
      if (di == 1) {
        cnt += dcnt[0];
        cnt += dcnt[0] + dcnt[1] - bit.queryz(t[idx]);
      } else {
        cnt += dcnt[0] - bit.queryz(t[idx]);
      }
      dcnt[di]++;
      bit.updatez(t[idx], 1);
    }
//    cout << ": " << cnt << " " << N*(N-1)/4 << endl;
    int64 all_c = N*(N-1)/2;
    return cnt < (all_c+1)/2;
  };

  REP(i, 100) {
    m = (l + r) / 2;
    if (ok(m)) {
      l = m;
    } else {
      r = m;
    }
  }
  return l;
}

int main(void) {
  cin >> N;
  A.resize(N); B.resize(N); C.resize(N);
  REP(i, N) {
    cin >> A[i] >> B[i] >> C[i];
  }
  t.resize(N);
  cout << fixed << setprecision(10) << calc(B, A, C) << " " << calc(A, B, C) << endl;

}



Measured memory_bytes: 7512