/// no time to waste
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define eb emplace_back
#define pii pair <int, int>
#define fi first
#define se second
#define all(ac) ac.begin(), ac.end()
#define MASK(x) (1LL << x)
#define ub(i, j) ((i >> j) & 1)
#define FLIP(x, y) ((MASK(x) - 1) ^ y)
const short MX = 10001;
short w[MX], v[MX];
int dp[101][1001];
vector <short> tr;
void solve() {
short n, m; cin >> n >> m;
for(short i=1;i<=n;i++) cin >> w[i];
for(short i=1;i<=n;i++) cin >> v[i];
short sq = sqrt(n);
int dp_cur[m + 1];
memset(dp_cur, 0, sizeof dp_cur);
for(short i=1;i<=n;i++) {
for(short j = m;j >= w[i];j--) {
dp_cur[j] = max(dp_cur[j], dp_cur[j - w[i]] + v[i]);
}
for(short j = 2;j <= m;j++) if(dp_cur[j] < dp_cur[j - 1]) {
dp_cur[j] = dp_cur[j - 1];
}
if(i % sq == 0) {
short id = i / sq;
for(short j = 1;j<=m;j++) {
dp[id][j] = dp_cur[j];
}
}
}
cout << dp_cur[m] << ' ';
bool choose[sq][m + 1];
while(n > 0 && m > 0) {
short pos_start = (n - 1) / sq * sq + 1;
short end_block = n;
short id = (pos_start - 1) / sq;
for(short i = 1;i<=m;i++) dp_cur[i] = dp[id][i];
for(short i = pos_start;i <= end_block; i++) {
for(short j=1;j<=m;j++) choose[i - pos_start][j] = 0;
for(short j=m;j>=w[i];j--) {
int new_val = dp_cur[j - w[i]] + v[i];
if(new_val > dp_cur[j]) {
dp_cur[j] = new_val;
choose[i - pos_start][j] = 1;
}
}
for(short j=2;j<=m;j++) if(dp_cur[j - 1] > dp_cur[j]) {
dp_cur[j] = dp_cur[j - 1];
choose[i - pos_start][j] = choose[i - pos_start][j - 1];
}
}
for(short i=end_block - pos_start;i >= 0 && m > 0;i--) if(choose[i][m]) {
tr.eb(i + pos_start);
m -= w[i + pos_start];
}
n = pos_start - 1;
}
cout << tr.size() << '\n';
for(short &v : tr) cout << v << ' ';
tr.clear();
return;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
#define task "tet"
if(fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int testcase; cin >> testcase;
while(testcase--) solve();
return 0;
}