#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C& a, C b) {
  a = min(a, b);
}
template <class C>
void maxi(C& a, C b) {
  a = max(a, b);
}
void a() {
  int n, x;
  cin >> n >> x;
  vector<bool> a(202, false);
  int b;
  for (int i = 0; i < n; i++) {
    cin >> b;
    a[b] = true;
  }
  for (int(i) = 1; i <= 201; i++) {
    if (!a[i] and x == 0) {
      cout << i - 1 << '\n';
      return;
    }
    if (a[i]) continue;
    x--;
  }
}
bool puedeSer(vector<int>& ap, int n) {
  for (int i = 2; i <= n; i++)
    if (ap[i] > ap[i - 1]) return false;
  return ap[1] == 2;
}
void b() {
  int n;
  cin >> n;
  vector<int> a(n);
  for (int i = 0; i < n; i++) cin >> a[i];
  vector<int> ap(n + 1);
  for (int i = 0; i < n; i++) ap[a[i]]++;
  if (!puedeSer(ap, n)) {
    cout << "0\n";
    return;
  }
  int l1 = n;
  while (ap[l1] != 2) l1--;
  int l2 = n - l1;
  vector<pair<int, int> > res;
  set<int> s;
  for (int i = 0; i < l1; i++) s.insert(a[i]);
  if (s.size() == l1 and l1 == *s.rbegin()) res.push_back({l1, l2});
  s.clear();
  reverse(a.begin(), a.end());
  for (int i = 0; i < l1; i++) s.insert(a[i]);
  if (s.size() == l1 and l1 == *s.rbegin() and l1 != l2)
    res.push_back({l2, l1});
  cout << res.size() << '\n';
  for (auto p : res) cout << p.first << ' ' << p.second << '\n';
}
void c() {
  long long n, m;
  cin >> n >> m;
  vector<long long> l(m);
  for (int i = 0; i < m; i++) cin >> l[i];
  long long suma = 0;
  for (auto li : l) suma += li;
  if (suma < n) {
    cout << "-1\n";
    return;
  }
  for (int i = 0; i < m; i++) {
    if (l[i] > n - i) {
      cout << "-1\n";
      return;
    }
  }
  vector<long long> res;
  for (int i = 0; i < m; i++) {
    res.push_back(max((long long)i + 1, n - suma + 1));
    suma -= l[i];
  }
  for (int i = 0; i < m; i++) cout << res[i] << ' ';
  cout << '\n';
}
void d() {
  long long d, m;
  cin >> d >> m;
  long long l = 1;
  long long r = 2;
  vector<long long> dp;
  while (l <= d) {
    dp.push_back(min(r, d + 1) - l);
    r *= 2;
    l *= 2;
  }
  long long res = 1;
  for (auto d : dp) {
    res *= (d + 1);
    res %= m;
  }
  res--;
  res %= m;
  if (res < 0) res += m;
  cout << res << '\n';
}
vector<int> res;
int h, g, n;
bool sePuede(vector<int>& a, int v, int height) {
  if (height == h) return true;
  if (a[2 * v] == 0 and a[2 * v + 1] == 0)
    return height > g;
  else if (a[2 * v] > a[2 * v + 1])
    return sePuede(a, 2 * v, height + 1);
  return sePuede(a, 2 * v + 1, height + 1);
}
void f(vector<int>& a, int v) {
  if (2 * v >= n)
    a[v] = 0;
  else if (a[2 * v] == 0 and a[2 * v + 1] == 0)
    a[v] = 0;
  else if (a[2 * v] > a[2 * v + 1]) {
    a[v] = a[2 * v];
    f(a, 2 * v);
  } else {
    a[v] = a[2 * v + 1];
    f(a, 2 * v + 1);
  }
}
void solve(vector<int>& a, int v, int height) {
  if (a[v] == 0) return;
  while (sePuede(a, v, height)) {
    f(a, v);
    res.push_back(v);
  }
  solve(a, 2 * v, height + 1);
  solve(a, 2 * v + 1, height + 1);
}
void e() {
  cin >> h >> g;
  n = (1 << h);
  vector<int> a(n);
  for (int(i) = 1; i <= n - 1; i++) cin >> a[i];
  res.clear();
  solve(a, 1, 1);
  long long suma = 0;
  for (int(i) = 1; i <= n - 1; i++) suma += a[i];
  cout << suma << '\n';
  for (int i = 0; i < res.size(); i++) cout << res[i] << ' ';
  cout << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  cin >> t;
  while (t--) e();
  return 0;
}
