#include <iostream>
#include <vector>
#include <array>
#include <map>
#include <algorithm>
using namespace std;
const int N = 1<<19;
array<int, 3> A[N];
vector<int> ft[N], vec[N];
int Mx[N], Z[N], inv[N], cur, Ans;
void solve(int n){
for (int i=1;i<=n;i++){
swap(A[i][1], A[i][2]);
int y = A[i][1], &z = Z[i];
for (int j=y-1; j ; j -= j & -j)
z = max(z, Mx[j]);
for (int j=y; j < N; j += j & -j)
Mx[j] = max(Mx[j], A[i][2]);
if (z != 0){
for (int j=y; j; j -= j & -j)
vec[j].push_back(z);
}
}
for (int i=1;i<=n;i++){
sort(begin(vec[i]), end(vec[i]));
vec[i].resize(unique(begin(vec[i]), end(vec[i])) - begin(vec[i]));
ft[i].resize(vec[i].size() + 1, 0);
}
for (int i=1, j = 1;i<=n;i = j){
while (j <= n and A[i][0] == A[j][0])
j++;
for (int k=i;k<j;k++){
auto [x, y, z] = A[k];
for (int I=y+1;I < N; I += I & -I){
int J = upper_bound(begin(vec[I]), end(vec[I]), z + 1) - begin(vec[I]);
for (J += !J; J < ft[I].size(); J += J & -J)
Ans = max(Ans, ft[I][J] + inv[x]);
}
}
for (int k=i;k<j;k++){
if (Z[k] == 0)
continue;
int y = A[k][1], z = Z[k];
for (int I=y; I ; I -= I & -I){
int J = upper_bound(begin(vec[I]), end(vec[I]), z) - begin(vec[I]);
for (; J ; J -= J & -J)
ft[I][J] = max(ft[I][J], inv[z] + inv[y]);
}
}
}
for (int i=1;i<N;i++){
ft[i].clear();
vec[i].clear();
Mx[i] = Z[i] = 0;
}
}
map<int, int> mp, mp2;
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n;
cin>>n;
for (int i=1;i<=n;i++){
for (int &j : A[i])
cin>>j, mp[j];
}
sort(A + 1, A + n + 1);
for (auto [i, j] : mp)
mp2[i] = ++cur, inv[cur] = i;
for (int i=1;i<=n;i++){
for (int &j : A[i])
j = mp2[j];
}
solve(n);
solve(n);
cout<<Ans<<endl;
}