#include <bits/stdc++.h>
inline int popcount(int x) {
  int t = 0;
  while (x) {
    x >>= 1;
    t++;
  }
  return t;
}
struct node {
  node *left, *right;
  int v, dist;
  node(int v = 0) : v(v), left(0), right(0), dist(1) {}
};
node* merge(node* x, node* y) {
  if (x == 0) return y;
  if (y == 0) return x;
  if (x->v > y->v) std::swap(x, y);
  x->right = merge(x->right, y);
  if ((x->right ? x->right->dist : 0) > (x->left ? x->left->dist : 0))
    std::swap(x->left, x->right);
  x->dist = (x->right ? x->right->dist : 0) + 1;
  return x;
}
void destroy(node* x) {
  if (x->left) destroy(x->left);
  if (x->right) destroy(x->right);
  delete x;
}
int n, m;
int a[2100000], b[2100000], trace[2100000], opt[2100000];
node* root[2100000];
bool exist[2100000];
void erase(int x) {
  a[x] = 0;
  if (popcount(x) == n) return;
  if (a[x << 1] == 0 && a[(x << 1) ^ 1] == 0) return;
  if (a[x << 1] > a[(x << 1) ^ 1]) {
    std::swap(a[x], a[x << 1]);
    if (a[x]) {
      trace[a[x]] = x;
      erase(x << 1);
    }
  } else {
    std::swap(a[x], a[(x << 1) ^ 1]);
    if (a[x]) {
      trace[a[x]] = x;
      erase((x << 1) ^ 1);
    }
  }
}
inline void solve() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < (1 << n); i++) {
    scanf("%d", &a[i]);
    b[i] = a[i];
    trace[a[i]] = i;
  }
  long long sum = 0;
  for (int i = (1 << n) - 1; i >= 1; i--) {
    root[i] = new node(a[i]);
    if (popcount(i) != n) {
      root[i] = merge(root[i], root[i << 1]);
      root[i] = merge(root[i], root[(i << 1) ^ 1]);
    }
    if (popcount(i) <= m) {
      if (popcount(i) == m) {
        node* x = root[i];
        opt[i] = x->v;
        root[i] = merge(x->left, x->right);
        delete x;
      } else {
        do {
          node* x = root[i];
          opt[i] = x->v;
          root[i] = merge(x->left, x->right);
          delete x;
        } while (!(opt[i] > opt[i << 1] && opt[i] > opt[(i << 1) ^ 1]));
      }
      exist[opt[i]] = true;
      sum += opt[i];
    }
  }
  destroy(root[1]);
  printf("%lld\n", sum);
  for (int i = (1 << n) - 1; i >= 1; i--)
    if (!exist[b[i]]) {
      printf("%d ", trace[b[i]]);
      erase(trace[b[i]]);
    }
  putchar('\n');
  for (int i = 1; i < (1 << m); i++) exist[opt[i]] = false;
}
int main() {
  int T;
  scanf("%d", &T);
  while (T--) solve();
  return 0;
}
