#define M 102
struct rice{
int cost,w,num;
}r[M];
int m,n;
int dp[M];
void CompletePack(int cost,int v)
{
for(int i=cost;i<=m;i++)
dp[i]=max(dp[i-cost]+v,dp[i]);
}
void ZeroOnePack(int cost,int v)
{
for(int i=m;i>=cost;i--)
dp[i]=max(dp[i-cost]+v,dp[i]);
}
void multiyPack(rice &p)
{
if(p.num*p.cost>=m)
CompletePack(p.cost,p.w);
int k=1;
while(k<p.num)
{
ZeroOnePack(p.cost*k,p.w*k);
p.num-=k;
k<<=1;
}
ZeroOnePack(p.cost*p.num,p.w*p.num);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
CLS(dp,0);//注意初始化
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++)
scanf("%d%d%d",&r[i].cost,&r[i].w,&r[i].num);
for(int i=0;i<n;i++)multiyPack(r[i]);
printf("%d\n",dp[m]);
}
return 0;
}