#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF 0x3f3f3f3f #define inf (-((LL)1<<40)) #define lson k<<1, L, mid #define rson k<<1|1, mid+1, R #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a, b) memset(a, b, sizeof(a)) #define FIN freopen("in.txt", "r", stdin) #define FOUT freopen("out.txt", "w", stdout) #define rep(i, a, b) for(int i = a; i <= b; i ++) #define dec(i, a, b) for(int i = a; i >= b; i --) //typedef __int64 LL; typedef long long LL; const int MAXN = 100002; const int MAXM = 110000; const double eps = 1e-12; const double PI = 4.0 * atan(1.0); const int MOD = 1000000007; int n, m, T; int a, b, c; struct Node { int a, b, c; Node (int _a = 0, int _b = 0, int _c = 0) { a = _a; b = _b; c = _c; } bool operator < (const Node &A) const { return (LL)b * A.c > (LL)c * A.b; } }no[MAXN]; LL dp[1100][3100]; int main() { // FIN; cin >> T; while(T--) { cin >> n >> m; for (int i = 1; i <= n; i ++) { scanf("%d %d %d", &a, &b, &c); no[i] = Node(a, b, c); } sort(no + 1, no + n + 1); mem0(dp); for (int i = 1; i <= n; i ++) { for (int j = 1; j <= m; j ++) { dp[i][j] = dp[i - 1][j]; if(j >= no[i].c) { dp[i][j] = max(dp[i][j], dp[i - 1][j - no[i].c] + no[i].a - j * no[i].b); } } } LL ans = 0; for (int i = 0; i <= m; i ++) ans = max(ans, dp[n][i]); cout << ans << endl; } return 0; }