RT,玄关求调
#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,fma,popcnt,tune=native")
using namespace std;
#define int long long
#define kg putchar(' ')
#define endl puts("")
inline int read(){
int vis=1,ans=0;
char x=getchar();
while(x<'0'||x>'9'){
if(x=='-')vis=-1;
x=getchar();
}
while(x>='0'&&x<='9'){
ans=ans*10+x-'0';
x=getchar();
}
return vis*ans;
}
inline void print(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
int n;
const int N=6e3+90,inf=1e18;
int dp[2][N*5];
int t[N][4];
int maxn;
signed main(){
n=read();
sizeof(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;i++){
t[i][1]=read();
t[i][2]=read();
t[i][3]=read();
}
for(int i=1,vis=1;i<=n;i++,vis^=1){
maxn+=max(t[i][1],t[i][3]);
for(int j=maxn;j>=0;j--){
dp[vis][j]=(!t[i][2]?inf:dp[vis^1][j]+t[i][2]);
if(j>=t[i][1])dp[vis][j]=min(dp[vis][j],(!t[i][1]?inf:dp[vis^1][j-t[i][1]]));
if(j>=t[i][3])dp[vis][j]=min(dp[vis][j],(!t[i][3]?inf:dp[vis^1][j-t[i][3]]+t[i][3]));
}
}
int minn=1e9;
for(int i=0;i<=maxn;i++)minn=min(minn,dp[n%2][i]+i);
print(minn);
return 0;
}