#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll INF=(1LL<<50);
double eps=1e-10,PI=acos(-1);

struct segtree{
  ll t[(1<<20)];
  void init(){
    for(int i=0;i<(1<<20);i++)t[i]=INF;
  }
  ll get(int a,int b,int k=0,int l=0,int r=(1<<19)){
    if( !(a<b) )return INF;
    if(b<=l||r<=a)return INF;
    if(a<=l&&r<=b)return t[k];
    return min( get(a,b,k*2+1,l,(l+r)/2) , get(a,b,k*2+2,(l+r)/2,r) );
  }
  void set(int i,ll x){
    i+=(1<<19)-1;
    t[i]=x;
    while(i){
      i=(i-1)/2;
      t[i]=min(t[i*2+1],t[i*2+2]);
    }
  }
};

struct data{
  double A;
  int x,y,cost;
  bool operator < (const data &p) const {
    return A < p.A;
  }
};

segtree st;
int n,a,b,c,d,e,f;
data t[400000];

void update(int i,int &a,double key){
  while(a+1<n+n && t[a].A<t[i].A+key )a++;
}
ll solve(){
  if(n<3)return -1;
  ll ans=INF;
  for(int i=0;i<n;i++){
    update(i,a,PI*0.5-eps);
    update(i,b,PI*1.0-eps);
    update(i,c,PI*1.0+eps);
    update(i,d,PI*1.5-eps);
    update(i,e,eps);
    update(i,f,PI*2.0-eps);
    ans=min( ans , st.get(a,b) + st.get(c,d) + t[i].cost);
    if( abs(t[b].A-(t[i].A+PI)) <eps ){
      ans=min( ans, st.get(e,b) + st.get(b,c) + st.get(c,f) + t[i].cost );
    }
  }
  return (ans==INF?-1LL:ans);
}

int main(){
  scanf("%d",&n);
  for(int i=0;i<n;i++){
    scanf("%d %d %d",&t[i].x,&t[i].y,&t[i].cost);
    if(t[i].x==0&&t[i].y==0){
      n--;
      i--;
      continue;
    }
    t[i].A=atan2( t[i].y , t[i].x );
    if(t[i].A<0)t[i].A+=PI*2.0;
  }
  sort(t,t+n);
  for(int i=0;i<n;i++){
    t[i+n]=t[i];
    t[i+n].A+=2.0*PI;
  }
  
  st.init();
  for(int i=0;i<n+n;i++){
    st.set( i , t[i].cost );
  }
  cout<<solve()<<endl;

  return 0;
}