#include <bits/stdc++.h>
using namespace std;
long long int gcd(long long int a, long long int b);
vector<string> split(string target, unsigned char c);
long long int n, k, t, m, x, y, g, h, a[1000005 * 4];
long long int mod = 998244353;
long long int ans;
void first(int id) {
  if (!a[id * 2] && !a[id * 2 + 1]) {
    a[id] = 0;
  } else if (a[id * 2] > a[id * 2 + 1]) {
    a[id] = a[id * 2];
    first(id * 2);
  } else {
    a[id] = a[id * 2 + 1];
    first(id * 2 + 1);
  }
}
bool check(int id) {
  if (!a[id * 2] && !a[id * 2 + 1]) return id >= (1 << g);
  if (a[id * 2] > a[id * 2 + 1])
    return check(id * 2);
  else
    return check(id * 2 + 1);
}
bool isPrime(long long int h);
int main() {
  cout.precision(10);
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> t;
  while (t--) {
    cin >> h >> g;
    for (int i = (1); i < (int)((1 << h)); i++) cin >> a[i];
    vector<int> v;
    int id = 1;
    while (v.size() < (1 << h) - (1 << g)) {
      while (check(id)) first(id), v.push_back(id);
      id++;
    }
    ans = 0;
    for (int i = (1); i < (int)((1 << h)); i++) ans += a[i], a[i] = 0;
    cout << ans << "\n";
    for (auto u : v) cout << u << " ";
    cout << "\n";
  }
}
long long int gcd(long long int a, long long int b) {
  return b == 0 ? a : gcd(b, a % b);
}
vector<string> split(string target, unsigned char c) {
  string d = "";
  vector<string> arr;
  for (auto n : target) {
    if (n != c)
      d += n;
    else if (d != "")
      arr.push_back(d), d = "";
  }
  if (d != "") arr.push_back(d), d = "";
  return arr;
}
bool isPrime(long long int g) {
  if ((g % 2 == 0 && g > 2) || g == 1) return 0;
  for (long long int i = 3; i * i <= g; i += 2)
    if (g % i == 0) return 0;
  return 1;
}
