#include <bits/stdc++.h>
using namespace std;
struct node {
  long long v, b, f;
  node() {
    b = 0;
    f = 0;
  }
  node(long long v_) {
    v = v_;
    b = 0;
    f = 0;
  }
};
long long h, g;
vector<node> v;
vector<long long> ans;
void upd(long long a) {
  if ((v[a * 2].b && (v[a * 2].v > v[a * 2 + 1].v)) ||
      (v[a * 2 + 1].b && (v[a * 2 + 1].v > v[a * 2].v))) {
    v[a].b = 1;
  }
  if (v[a].f && (v[a * 2].v == 0) && (v[a * 2 + 1].v == 0)) {
    v[a].b = 1;
  }
}
void go(long long a) {
  if ((v[a * 2].v == 0) && (v[a * 2 + 1].v == 0)) {
    v[a].v = 0;
    upd(a);
    return;
  }
  if (v[a * 2].v > v[a * 2 + 1].v) {
    v[a].v = v[a * 2].v;
    go(a * 2);
  } else {
    v[a].v = v[a * 2 + 1].v;
    go(a * 2 + 1);
  }
  upd(a);
}
void f(long long a) {
  while (!(v[a].b)) {
    go(a);
    ans.push_back(a);
  }
  if (v[a * 2].v) f(a * 2);
  if (v[a * 2 + 1].v) f(a * 2 + 1);
  return;
}
void solve() {
  cin >> h >> g;
  v.assign((1 << h + 1), node(0));
  ans.resize(0);
  for (long long i = 1, a; i <= (1 << h) - 1; i++) {
    cin >> a;
    v[i] = node(a);
  }
  for (long long i = (1 << (g - 1)); i <= ((1 << g) - 1); i++) {
    v[i].f = 1;
  }
  f(1);
  long long sum = 0;
  for (auto e : v) sum += e.v;
  cout << sum << "\n";
  for (auto e : ans) cout << e << " ";
  cout << "\n";
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long t;
  cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}
