#include <iostream>#include <iomanip>#include <sstream>#include <string>#include <cstdio>#include <algorithm>#include <cstring>#include <cctype>#include <cmath>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <bitset>using namespace std;struct data{ int a, p, t; data(int a=0,int p=0,int t=0):a(a),p(p),t(t){}};bool operator>(data a, data b){ return (a.a>b.a) || (a.a==b.a && a.p>b.p) || (a.a==b.a && a.p==b.p && a.t<b.t);}data operator+(data a,data b){ return data(a.a+b.a,a.p+b.p,a.t+b.t);}bool cmp(data a,data b){ return (a.t<b.t) ;}data f[6000];data inp[60];int main(){ int ncase, n, T; cin>>ncase; while (ncase--) { memset(f,0,sizeof(f)); cin>>T>>n; for (int i=0; i<n; i++) inp[i].p=1; for (int i=0; i<n; i++) cin>> inp[i].t; for (int i=0; i<n; i++) cin>> inp[i].a; sort(inp, inp+n, cmp); f[0]=data(0, 0, 0); for (int i=0; i<n; i++) { for (int j=T-inp[i].t; j>=0; j--) if (f[j]+data(inp[i].a, inp[i].p, j+inp[i].t) > f[j+inp[i].t]) f[j+inp[i].t] = f[j] + data(inp[i].a, inp[i].p, j+inp[i].t); for (int j=0; j<T; j++) if (f[j]>f[j+1]) f[j+1] = f[j]; } for (int i=0; i<=T; i++) if (f[i]>f[0]) f[0]=f[i]; cout<< f[0].a << " " << f[0].p << " " << f[0].t << endl; } return 0;}