#include <bits/stdc++.h>
using namespace std;
int read() {
  int res = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-') f = -1, c = getchar();
  while (isdigit(c)) res = (res << 3) + (res << 1) + (c ^ 48), c = getchar();
  return res * f;
}
const int maxn = (1 << 21) + 10;
int h, g, n, m, lo[maxn], a[maxn];
int vis[maxn], ans[maxn];
void dfs(int k, int lay) {
  int ls = k << 1, rs = k << 1 | 1;
  if (!a[ls] && !a[rs]) {
    a[k] = 0;
  } else {
    int c = a[ls] > a[rs] ? ls : rs;
    a[k] = a[c];
    dfs(c, lay + 1);
  }
  if (!a[ls] && !a[rs] && lay == g)
    vis[k] = 1;
  else if (lay < g) {
    int c = a[ls] > a[rs] ? ls : rs;
    if (vis[c]) vis[k] = 1;
  }
  return;
}
int main() {
  for (int i = 1; i <= (1 << 20) - 1; i++) lo[i] = lo[i >> 1] + 1;
  int T = read();
  while (T--) {
    h = read();
    g = read();
    n = (1 << h) - 1;
    m = (1 << g) - 1;
    for (int i = 1; i <= n; i++) a[i] = read(), vis[i] = 0;
    for (int i = n + 1; i <= n * 2 + 1; i++) a[i] = vis[i] = 0;
    int x = 1, cnt = n;
    while (cnt > m) {
      ans[n - cnt + 1] = x;
      dfs(x, lo[x]);
      while (vis[x]) x++;
      cnt--;
    }
    long long sum = 0;
    for (int i = 1; i <= m; i++) sum += a[i];
    printf("%I64d\n", sum);
    for (int i = 1; i <= n - m; i++) printf("%d ", ans[i]);
    putchar(10);
  }
  return 0;
}
