#include<iostream>#include<string>#include<cstdio>#include<algorithm>#include<string.h>#include<cmath>using namespace std;const int N=100001;struct A{int s,x,y;};A d[N];struct T{int l,r,f,m;};T seg[6*N];void build(int l,int r,int rt=1){seg[rt].l=l;seg[rt].r=r;seg[rt].f=seg[rt].m=0;if(l==r)return;int m=(l+r)>>1;build(l,m,rt<<1);build(m+1,r,rt<<1|1);}int Max(int a,int b){return a>b?a:b;}void update(int l,int r,int f,int rt=1){if(l<=seg[rt].l&&seg[rt].r<=r){seg[rt].f=Max(f,seg[rt].f);seg[rt].m=Max(f,seg[rt].m);return;}if(seg[rt].f){seg[rt<<1].f=Max(seg[rt].f,seg[rt<<1].f);seg[rt<<1].m=Max(seg[rt<<1].f,seg[rt<<1].m);seg[rt<<1|1].f=Max(seg[rt].f,seg[rt<<1|1].f);seg[rt<<1|1].m=Max(seg[rt<<1|1].f,seg[rt<<1|1].m);seg[rt].f=0;}int m=(seg[rt].l+seg[rt].r)>>1;if(r<=m)update(l,r,f,rt<<1);else if(l>m)update(l,r,f,rt<<1|1);else{update(l,m,f,rt<<1);update(m+1,r,f,rt<<1|1);}seg[rt].m=Max(seg[rt<<1].m,seg[rt<<1|1].m);}int query(int pos,int rt=1){if(seg[rt].l==seg[rt].r){return seg[rt].m;}if(seg[rt].f){seg[rt<<1].f=Max(seg[rt].f,seg[rt<<1].f);seg[rt<<1].m=Max(seg[rt<<1].f,seg[rt<<1].m);seg[rt<<1|1].f=Max(seg[rt].f,seg[rt<<1|1].f);seg[rt<<1|1].m=Max(seg[rt<<1|1].f,seg[rt<<1|1].m);seg[rt].f=0;}int m=(seg[rt].l+seg[rt].r)>>1;if(pos<=m)return query(pos,rt<<1);else return query(pos,rt<<1|1);}int main(){int n;while(cin>>n){int i;for(i=1;i<=n;i++){cin>>d[i].s>>d[i].x>>d[i].y;d[i].x+=i;d[i].y+=i-1;if(d[i].x>n)d[i].x=n+1;if(d[i].y>n)d[i].y=n+1;}build(1,n+10);int c=0;for(i=1;i<=n;i++){int m=query(i);if(m!=0||i==1){update(d[i].x,d[i].y,d[i].s+m);}}cout<<seg[1].m<<endl;}return 0;}


