#include <bits/stdc++.h>
using namespace std;
const int SZ = (1 << 20) + 4;
const double EPS = 1e-7;
const int mod = 998244353;
const int hashpow = 127;
const int inf = 2e9;
int h, g;
int a[SZ];
int ans[SZ];
void read() {
  cin >> h >> g;
  for (int i = 1; i < (1 << h); ++i) {
    cin >> a[i];
  }
}
struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }
  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};
void solve() {
  unordered_set<int, custom_hash> res;
  long long sum = 0;
  vector<vector<int>> t(1 << h);
  for (int cur = (1 << h) - 1; cur > 0; --cur) {
    if (cur * 2 >= (1 << h)) {
      t[cur].push_back(a[cur]);
      continue;
    }
    vector<int> tmp = {a[cur]};
    vector<int> tmp2;
    merge(t[cur * 2].begin(), t[cur * 2].end(), t[cur * 2 + 1].begin(),
          t[cur * 2 + 1].end(), back_inserter(tmp2));
    merge(tmp.begin(), tmp.end(), tmp2.begin(), tmp2.end(),
          back_inserter(t[cur]));
  }
  for (int cur = (1 << g) - 1; cur > 0; --cur) {
    if (cur * 2 >= (1 << g)) {
      ans[cur] = t[cur][0];
      res.insert(ans[cur]);
      sum += ans[cur];
      continue;
    }
    int x = *upper_bound(t[cur].begin(), t[cur].end(), ans[cur * 2]);
    int y = *upper_bound(t[cur].begin(), t[cur].end(), ans[cur * 2 + 1]);
    ans[cur] = max(x, y);
    res.insert(ans[cur]);
    sum += ans[cur];
  }
  cout << sum << "\n";
  for (int i = (1 << h) - 1; i > 0; --i) {
    if (!res.count(a[i])) {
      cout << i << " ";
    }
  }
  cout << "\n";
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int t;
  cin >> t;
  for (int i = 0; i < t; ++i) {
    read();
    solve();
  }
  return 0;
}
