#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define rep2(i,a,b) for(ll i=(a);i<(b);i++)
#define all(a)  (a).begin(),(a).end()
#define pb emplace_back
#define INF (1e9+1)
//#define INF (1LL<<59)

//verified POJ3680
#define MAX_V (365+3)
struct edge { int to, cap, cost,rev; };

vector<edge> G[MAX_V];

// fromテ」ツ?凝」ツつ液oテ」ツ?クテ・ツ青妥」ツ?凝」ツ??・ツョツケテゥツ?縦apテ」ツ??」ツつウテ」ツつケテ」ツδ?ostテ」ツ?ョティツセツコテ」ツつ津」ツつッテ」ツつ凖」ツδゥテ」ツδ陛」ツ?ォティツソツステ・ツ環?」ツ?凖」ツつ?
void add_edge(int from, int to, int cap, int cost) {
    G[from].push_back((edge){to, cap, cost, (int)G[to].size()});
    G[to].push_back((edge){from, 0, -cost, (int)G[from].size() - 1});
}

//テ」ツつウテ」ツつケテ」ツδ暗」ツ?古ィツイツ?」ツ?ョティツセツコテ」ツ?古・ツ青ォテ」ツ?セテ」ツつ古」ツ?ェテ」ツ??・ツ?エテ・ツ青暗」ツ?ッテ、ツクツ催ィツヲツ?
void shortest_path(int s,vector<int> &d){
    int v = d.size();
    rep(i,d.size())d[i]=INF;
    d[s]=0;
    rep(loop,v){
        rep(i,v){
            for(auto e:G[i]){
                if(e.cap && d[i]!=INF && d[e.to] > d[i]+e.cost)
                    d[e.to] = d[i]+e.cost;
            }
        }
    }
}


// sテ」ツ?凝」ツつ液テ」ツ?クテ」ツ?ョテヲツオツ?ゥツ?叔テ」ツ?ョテヲツ慊?・ツーツ湘ィツイツサテァツ板ィテヲツオツ?」ツつ津ヲツアツづ」ツつ?」ツつ?
// テヲツオツ?」ツ?崚」ツ?ェテ」ツ??・ツ?エテ・ツ青暗」ツ?ッ-1テ」ツつ津ィツソツ氾」ツ??
int min_cost_flow(int s, int t, int f) {
    vector<int> h(MAX_V);	//テ」ツδ敕」ツδ?」ツδウテ」ツつキテ」ツδ」テ」ツδォ
    vector<int> dist(MAX_V);// テヲツ慊?ァツ淞ュティツキツ敕ゥツ崢「
    int prevv[MAX_V], preve[MAX_V];// テァツ崢エテ・ツ可催」ツ?ョテゥツ?づァツつケテ」ツ?ィティツセツコ

    int res = 0;
    shortest_path(s, h);
    
    while (f > 0) {
        // テ」ツつソテ」ツつ凖」ツつ、テ」ツつッテ」ツつケテ」ツδ暗」ツδゥテヲツウツ陛」ツつ津ァツ板ィテ」ツ??」ツ?ヲhテ」ツつ津ヲツ崢エテヲツ鳴ーテ」ツ?凖」ツつ?
        priority_queue<pii, vector<pii>, greater<pii> > que;
        rep(i,dist.size())dist[i]=INF;
        dist[s] = 0;
        que.push(pii(0, s));
        while (!que.empty()) {
            pii p = que.top(); que.pop();
            int v = p.second;
            if (dist[v] < p.first) continue;
            for (int i = 0; i < G[v].size(); i++) {
                edge &e = G[v][i];
                if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
                    dist[e.to] = dist[v] + e.cost + h[v] - h[e.to]; prevv[e.to] = v;
                    preve[e.to] = i;
                    que.push(pii(dist[e.to], e.to));
                }
            }
        }
        if (dist[t] == INF) return -INF;	//テ」ツ?禿」ツつ古、ツサツ・テ、ツクツ甘ヲツオツ?」ツ?崚」ツ?ェテ」ツ??
        
        for (int v = 0; v < h.size(); v++) h[v] += dist[v];
        
        
        // s-tテゥツ鳴禿ヲツ慊?ァツ淞ュティツキツッテ」ツ?ォテヲツイツソテ」ツ?」テ」ツ?ヲテァツ崢ョテ、ツクツ?ヲツ敖ッテヲツオツ?」ツ??
        int d = f;
        for (int v = t; v != s; v = prevv[v]) {
            d = min(d, G[prevv[v]][preve[v]].cap);
        }
        f -= d;
        res += d * h[t];
        for (int v = t; v != s; v = prevv[v]) {
            edge &e = G[prevv[v]][preve[v]]; e.cap -= d;
            G[v][e.rev].cap += d;
        }
    }
    return res;
}

int main(){
    int n;
    while(cin>>n&&n){
        rep(i,MAX_V)G[i].clear();
        
        map<pii,vector<int>> mp;
        set<int> st;
        rep(i,n){
            int s,t,c;
            cin>>s>>t>>c;
            s--,t;
            st.insert(s);
            st.insert(t);
            mp[pii(s,t)].pb(c);
        }
        for(auto e:mp){
            sort(all(e.second),greater<int>());
            rep(i,min(2,(int)e.second.size()))add_edge(e.first.first, e.first.second, 1, -e.second[i]);
        }
        int S = 366;
        int T = S+1;
        
        int bef = -1;
        for(auto it = st.begin();it!=st.end();it++){
            if(it==st.begin()){
                bef = *it;
            }else{
                add_edge(bef,*it,INF,0);
                bef = *it;
            }
        }
        auto it = st.begin();
        add_edge(S, *it, INF, 0);
        
        it = st.end();
        add_edge(*(--it), T, INF, 0);
        
        cout<<-1*min_cost_flow(S, T, 2)<<endl;
    }
}

Measured memory_bytes: 3228