#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, n) for(int i=0;i<n;i++)
typedef pair<int,int> P;
typedef pair<int, P> P1;
#define a first
#define b second
#define mp make_pair
#define eb emplace_back
template<class t>using vc = vector<t>;
using S = array<int, 4>;
S op(S a, S b){
S c{};
c[3] = a[3] + b[3];
c[2] = max(b[2], a[2]+b[3]);
c[1] = max(a[1], a[3]+b[1]);
c[0] = max(max(a[0], b[0]), a[2]+b[1]);
return c;
}
S e(){
return S{(int)-1e18, (int)-1e18, (int)-1e18, 0};
}
S seg[1<<12];
void update(int pos, S a){
pos += (1<<11)-1;
seg[pos] = a;
while(pos){
pos = (pos-1) / 2;
seg[pos] = op(seg[pos*2+1], seg[pos*2+2]);
}
}
int n, x[2005], y[2005], c[2005];
P dir[2005][2005];
signed main(){
cin >> n;
vc<P1>vec(n);
rep(i, n) cin >> vec[i].b.a >> vec[i].b.b >> vec[i].a;
sort(vec.begin(), vec.end(), [](P1 a, P1 b){
return mp(a.b.b, a.b.a) < mp(b.b.b, b.b.a);
});
using d = long double;
vc<pair<d,P>>ev;
rep(i, n) for(int j=i+1;j<n;j++){
auto p1 = vec[i].b;
auto p2 = vec[j].b;
if(p1 > p2) swap(p1, p2);
int dx = p2.a - p1.a;
int dy = p2.b - p1.b;
if(p1.b <= p2.b){
ev.eb(atan2((d)dy, (d)dx), mp(i, j));
dir[i][j] = mp(dx, dy);
}
else{
ev.eb(atan2((d)dy*-1, (d)dx*-1), mp(i, j));
dir[i][j] = mp(-dx, -dy);
}
}
sort(ev.begin(), ev.end());
rep(i, (1<<12)) seg[i] = e();
rep(i, n){
int a = vec[i].a;
update(i,S{max(0LL,a), max(0LL,a), max(0LL,a), a});
}
vc<int>rev(n);
rep(i, n) rev[i] = i;
int ans = seg[0][0];
rep(_, ev.size()){
d deg = ev[_].a;
int u = ev[_].b.a;
int v = ev[_].b.b;
//swap
update(rev[u], S{max(0LL, vec[v].a), max(0LL, vec[v].a), max(0LL, vec[v].a), vec[v].a});
update(rev[v], S{max(0LL, vec[u].a), max(0LL, vec[u].a), max(0LL, vec[u].a), vec[u].a});
swap(rev[u], rev[v]);
bool ok = (_+1 == ev.size());
if(!ok){
P p = dir[ev[_].b.a][ev[_].b.b];
P q = dir[ev[_+1].b.a][ev[_+1].b.b];
if(p.b * q.a != p.a * q.b) ok = true;
if(p.a * q.a + p.b * q.b < 0) ok = true;
}
if(ok){
ans = max(ans, seg[0][0]);
}
}
cout << ans << '\n';
}