#include <bits/stdc++.h>
using namespace std;
void err(istream_iterator<string> it) {}
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << "\n";
  err(++it, args...);
}
const double PI = acos(-1);
const double eps = (1e-9);
const long long int INF = 2e9;
const int N = (1 << 21);
int num[N];
int lft[N], rht[N], v[N];
vector<int> ans;
int n, s, k;
void call(int p) {
  if (v[p] == 0) return;
  int l = 2 * p, r = 2 * p + 1;
  if (v[l] == 0 && v[r] == 0) return;
  if (v[l] > v[r]) {
    if (lft[p] < num[p])
      lft[p]++, call(l);
    else
      ans[s] = r, rht[p]++, call(r);
  } else {
    if (rht[p] < num[p])
      rht[p]++, call(r);
    else
      ans[s] = l, lft[p]++, call(l);
  }
  return;
}
void fun(int p) {
  if (v[p] == 0) return;
  int l = 2 * p, r = 2 * p + 1;
  if (v[l] == 0 && v[r] == 0) {
    v[p] = 0;
    return;
  }
  if (v[l] > v[r])
    v[p] = v[l], fun(l);
  else
    v[p] = v[r], fun(r);
  return;
}
void solve() {
  int h, g, m, i;
  scanf("%d%d", &h, &g);
  n = (1 << h) - 1;
  fill(v, v + 2 * n + 5, 0);
  for (i = 1; i <= n; ++i) scanf("%d", &v[i]);
  k = (1 << g) - 1;
  m = (1 << h) - (1 << g);
  ans.clear();
  fill(lft, lft + n + 1, 0);
  fill(rht, rht + n + 1, 0);
  num[1] = m / 2;
  for (i = 2; i < n + 1; ++i) num[i] = (num[i / 2] / 2);
  ans.resize(m, 1);
  for (s = 0; s < m; ++s) call(1), fun(ans[s]);
  long long int sum = 0;
  for (i = 1; i <= k; ++i) sum += v[i];
  cout << sum << "\n";
  for (i = 0; i < m; i++) printf("%d ", ans[i]);
  printf("\n");
}
int main() {
  int t = 1;
  scanf("%d", &t);
  while (t--) solve();
}
