Problem:
すぬけ君は，初期状態では動くことはできない．i 番目のチケットの値段は pi であり，これを買うと任意の (x, y) と任意の非負実数 t に対し(x, y) から(x + tai, y + tbi) に移動することができるようになる．すぬけ君が平面上の任意の二点間を(いくつかのチケットを組み合わせて) 移動できるようになるために買わなければならないチケットの合計金額の最小値を求めよ．

Constraints

1 ≤ n ≤ 200000

−109 ≤ ai, bi ≤ 109

1 ≤ pi ≤ 109

入力は全て整数である

Input

n
a1 b1 p1
. . .
an bn pn

Output

平面上の任意の二点間を移動できるようになるために買わなければならないチケットの合計金額の最小値を出力せよ．できない場合は-1 を出力せよ．

Sample Input 1

7
0 3 1
0 3 2
1 -1 2
0 0 1
-2 4 1
-4 0 1
2 1 2

たとえばチケット1, 3, 6 を買うとよい．

Sample Output 1

4

Sample Input 2

2
1 2 3
4 5 6

Sample Output 2

-1

Solution in C++14 (judge verdict: Wrong Answer)

#include <iostream>
#include <fstream>
#include <cassert>
#include <typeinfo>
#include <vector>
#include <stack>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <iomanip>
#include <cctype>
#include <random>
#include <complex>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<long double,long double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<long double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<int,P> pip;
typedef vector<pip> vip;
const int inf=1<<30;
const ll INF=1ll<<61;
const long double pi=acos(-1);
const long double eps=1e-10;
const ll mod=1e9+7;
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

template <class T>
class RMQ{
    private:
    int n;
    vector<T> rmq;
    T Query_func(int a,int b,int k,int l,int r){
        if(r<=a||b<=l) return INF;
        if(a<=l&&r<=b) return rmq[k];
        int m=(l+r)/2;
        T vl=Query_func(a,b,k*2+1,l,m);
        T vr=Query_func(a,b,k*2+2,m,r);
        return (vl<vr)?vl:vr;
    }
    public:
    RMQ(int n_){
        n=1;
        while(n<n_) n*=2;
        rmq=vector<T>(2*n-1,inf);
    }
    void Update(int k,T x){
        k+=n-1;
        rmq[k]=x;
        while(k>0){
            k=(k-1)/2;
            rmq[k]=min(rmq[k*2+1],rmq[k*2+2]);
        }
    }
    T Query(int a,int b){
        return Query_func(a,b,0,0,n);
    }
};
 
int n;
vd b;
 
long double f(long double x,long double y){
    long double c=acos(x/sqrt(x*x+y*y));
    if(y>0) return c;
    return 2*pi-c;
}
 
int id(long double x){
    return lower_bound(b.begin(),b.end(),x)-b.begin();
}
 
int main(){
    cin>>n;
    int N=0;
    vector<pair<long double,int> > a;
    for(int i=0;i<n;i++){
        int x,y,c;
        cin>>x>>y>>c;
        if(!x&&!y) continue;
        N++;
        long double arg=f(x,y);
        a.push_back({arg-2*pi,c});
        a.push_back({arg,c});
        a.push_back({arg+2*pi,c});
    }
    sort(a.begin(),a.end());
    RMQ<ll> rmq(3*N);
    b=vd(3*N);
    for(int i=0;i<3*N;i++){
        rmq.Update(i,a[i].second);
        b[i]=a[i].first;
    }
    ll res=INF;
    for(int i=n;i<2*N;i++){
        ll A=rmq.Query(id(b[i]-pi+eps),id(b[i]-pi/2-eps));
        ll B=rmq.Query(id(b[i]+pi/2+eps),id(b[i]+pi-eps));
        res=min(res,A+B+a[i].second);
    }
    cout<<(res==INF?-1:res)<<endl;
}