#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MaxN=5100;
const int INF=2e9+7;

struct node{
    int l,r,d,v;
    bool operator < (const node &v) const{
        return d<v.d;
    }
} a[MaxN];

int n;
int f[MaxN],g[MaxN*2];

void disc(){
    vector <int> t;
    for (int i=1; i<=n; i++){
        t.push_back(a[i].l);
        t.push_back(a[i].r);
    }
    sort(t.begin(),t.end());
    t.erase(unique(t.begin(),t.end()),t.end());
    for (int i=1; i<=n; i++){
        a[i].l=lower_bound(t.begin(),t.end(),a[i].l)-t.begin();
        a[i].r=lower_bound(t.begin(),t.end(),a[i].r)-t.begin();
    }
}

int main(){
    while (scanf("%d",&n)!=EOF){
        for (int i=1; i<=n; i++){
            scanf("%d%d%d",&a[i].l,&a[i].d,&a[i].v);
            a[i].r=a[i].l+a[i].d;
        }
        sort(a+1,a+n+1);
        a[++n].l=0; a[n].r=INF; a[n].v=0;
        disc();
        vector <int> b[MaxN*2];
        for (int i=1; i<=n; i++) b[a[i].r].push_back(i);

        for (int i=1; i<=n; i++){
            int l=a[i].l;
            int r=a[i].r;
            f[i]=0; g[l]=0;
            for (int j=l+1; j<=r; j++){
                g[j]=g[j-1];
                for (int k=0; k<b[j].size(); k++){
                    int v=b[j][k];
                    if (v>=i || a[v].l<l) continue;
                    g[j]=max(g[j],g[a[v].l]+f[v]);
                }
            }
            f[i]=g[r]+a[i].v;
        }
        printf("%d\n",f[n]);
    }
    return 0;
}
