//NiceDuck
#include "bits/stdc++.h"
typedef long long ll;
using namespace std;
#define FILE "000"
#define foru(i,a,b) for(int i=(int)(a); i<=(int)(b); ++i)
#define ford(i,a,b) for(int i=(int)(a); i>=(int)(b); --i)
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);
#define pb push_back
#define fi first
#define se second
#define pii pair<int,int>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define MOD 1000000007
#define el "\n"
#define MAX 10004

int n;
struct Stone
{
    int len,wid,hei,id;
};
vector<Stone> stones;

bool cmp(const Stone &x, const Stone &y)
{
    return x.len>y.len || x.len==y.len && x.wid>y.wid;
}

int trace[2*MAX],f[2*MAX];
void calc()
{
    memset(trace,-1,sizeof(trace));
    int ans=0,idx=-1;
    foru(i,0,stones.size()-1)
    {
        f[i]=stones[i].hei;
        foru(j,0,i-1)
        {
            if(stones[j].len>=stones[i].len && stones[j].wid>=stones[i].wid)
            {
                if(f[i]<f[j]+stones[i].hei)
                {
                    f[i]=f[j]+stones[i].hei;
                    trace[i]=j;
                }
            }
        }
        if(ans<f[i])
        {
            ans=f[i];
            idx=i;
        }
    }
    cout<<ans<<el;
    vector<Stone> v;
    while(idx!=-1)
    {
        v.pb(stones[idx]);
        idx=trace[idx];
    }
    cout<<(int)v.size()<<el;
    bool change=false;
    ford(i,v.size()-1,0)
    {
        cout<<v[i].id<<' '<<min(v[i].wid,v[i].len)<<' '<<max(v[i].wid,v[i].len)<<' '<<v[i].hei<<el;
    }
}

int main()
{
    fastio
    #ifndef ONLINE_JUDGE
    freopen(FILE ".inp","r",stdin);
    freopen(FILE ".out","w",stdout);
    #endif // ONLINE_JUDGE
    
    cin>>n;
    foru(i,1,n)
    {
        int a,b,c; cin>>a>>b>>c;
        if(a<=b && a<=c) swap(a,c); // a=min(a,b,c)
        if(b<=a && b<=c) swap(b,c); // b=min(a,b,c)
        stones.pb({a,b,c,i}); 
        if(a!=b) stones.pb({b,a,c,i});
    }
    sort(stones.begin(),stones.end(),cmp);
    calc();
    
    return 0;
}
