#include <iostream>
#include <string>
#include <stack>
using namespace std;
struct hw
{
string name; //课程名称
int ddl; //截止日期
int cost; //花费时间
}work[20];
struct state
{
int cost; //花费时间
int redu; //扣的分数
int pre; //上一个状态
int cur; //当前状态写的哪门作业
}dp[1 << 15 + 1]; //n最大为15
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n;
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++)
{
cin >> work[i].name >> work[i].ddl >> work[i].cost;
}
int smax = 1 << n; //所有作业的完成情况总数
for (int i = 1; i < smax; i++) //枚举所有可能的情况
{
dp[i].redu = INT_MAX; //初始延期设为最大
for (int j = n - 1; j >= 0; j--) //下一门写的作业
{
int tmp = 1 << j; //写第几门作业(写第几门,几号位为1)
if (i & tmp) //判断当前作业是否完成(如果完成,则说明刚刚做过此作业)
{
int pre = i - tmp; //前一个状态
int reduce = dp[pre].cost + work[j].cost - work[j].ddl; //当前作业要扣掉的分数
if (reduce < 0)
reduce = 0; //未超时,不扣分
if (reduce + dp[pre].redu < dp[i].redu) //扣的分数小于现在扣的分数
{
dp[i].redu = reduce + dp[pre].redu; //更新扣掉的分数
dp[i].pre = pre; //更新前一个状态是pre
dp[i].cur = j; //更新目前写的作业是j
dp[i].cost = dp[pre].cost + work[j].cost; //更新消耗的时间
}
}
}
}
cout << dp[smax - 1].redu << endl;
stack<int> q;
int tmp = smax - 1;
while (tmp) //将课程入栈,反向输出
{
q.push(dp[tmp].cur);
tmp = dp[tmp].pre;
}
while (!q.empty())
{
cout << work[q.top()].name << endl;
q.pop();
}
}
return 0;
}