#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct block
{
long long a,b,c,d;
}blocks[1010];
long long dp[1010];
/*
__int64 max(__int64 a,__int64 b)
{
if(a>b)
return a;
else return b;
}*/
bool cmp(block aa,block bb)
{
return ((aa.a<bb.a)||
((aa.a==bb.a)&&(aa.b<bb.b))||
((aa.a==bb.a)&&(aa.b==bb.b)&&(aa.d>bb.d)));
}
int main()
{
int n;
// int t;
long long t;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>blocks[i].a>>blocks[i].b>>blocks[i].c>>blocks[i].d;
if(blocks[i].a<blocks[i].b)
{
t=blocks[i].a;
blocks[i].a=blocks[i].b;
blocks[i].b=t;
}
}
sort(blocks,blocks+n,cmp);
for(int i=0;i<n;i++)
{
dp[i]=blocks[i].c;
}
for(int i=1;i<n;i++)
{
if(blocks[i].d==0)
{
for(int j=0;j<i;j++)
{
if(blocks[j].a<=blocks[i].a && blocks[j].b<=blocks[i].b)
if(dp[j]+blocks[i].c>dp[i])
{
dp[i]=dp[j]+blocks[i].c;
}
}
}
else if(blocks[i].d==1)
{
for(int j=0;j<i;j++)
{
if(blocks[j].a<=blocks[i].a && blocks[j].b<=blocks[i].b && blocks[j].a*blocks[j].b<blocks[i].a*blocks[i].b)
if(dp[j]+blocks[i].c>dp[i])
{
dp[i]=dp[j]+blocks[i].c;
}
}
}
else if(blocks[i].d==2)
{
for(int j=0;j<i;j++)
{
if(blocks[j].a<blocks[i].a && blocks[j].b<blocks[i].b)
if(dp[j]+blocks[i].c>dp[i])
{
dp[i]=dp[j]+blocks[i].c;
}
}
}
}
long long sum=dp[0];
for(int i=1;i<n;i++)
{
if(dp[i]>sum)
sum=dp[i];
}
//printf("%lldd\n",sum);
cout<<sum<<endl;
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct block
{
long long a,b,c,d;
}blocks[1010];
long long dp[1010];
/*
__int64 max(__int64 a,__int64 b)
{
if(a>b)
return a;
else return b;
}*/
bool cmp(block aa,block bb)
{
return ((aa.a<bb.a)||
((aa.a==bb.a)&&(aa.b<bb.b))||
((aa.a==bb.a)&&(aa.b==bb.b)&&(aa.d>bb.d)));
}
int main()
{
int n;
// int t;
long long t;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>blocks[i].a>>blocks[i].b>>blocks[i].c>>blocks[i].d;
if(blocks[i].a<blocks[i].b)
{
t=blocks[i].a;
blocks[i].a=blocks[i].b;
blocks[i].b=t;
}
}
sort(blocks,blocks+n,cmp);
for(int i=0;i<n;i++)
{
dp[i]=blocks[i].c;
}
for(int i=1;i<n;i++)
{
if(blocks[i].d==0)
{
for(int j=0;j<i;j++)
{
if(blocks[j].a<=blocks[i].a && blocks[j].b<=blocks[i].b)
if(dp[j]+blocks[i].c>dp[i])
{
dp[i]=dp[j]+blocks[i].c;
}
}
}
else if(blocks[i].d==1)
{
for(int j=0;j<i;j++)
{
if(blocks[j].a<=blocks[i].a && blocks[j].b<=blocks[i].b && blocks[j].a*blocks[j].b<blocks[i].a*blocks[i].b)
if(dp[j]+blocks[i].c>dp[i])
{
dp[i]=dp[j]+blocks[i].c;
}
}
}
else if(blocks[i].d==2)
{
for(int j=0;j<i;j++)
{
if(blocks[j].a<blocks[i].a && blocks[j].b<blocks[i].b)
if(dp[j]+blocks[i].c>dp[i])
{
dp[i]=dp[j]+blocks[i].c;
}
}
}
}
long long sum=dp[0];
for(int i=1;i<n;i++)
{
if(dp[i]>sum)
sum=dp[i];
}
//printf("%lldd\n",sum);
cout<<sum<<endl;
}
return 0;
}