#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (auto i = begin(v); i != end(v); i++)
    os << *i << (i == end(v) - 1 ? "" : " ");
  return os;
}
template <class T>
istream& operator>>(istream& is, vector<T>& v) {
  for (auto i = begin(v); i != end(v); i++) is >> *i;
  return is;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t;
  scanf("%d", &t);
  while (t-- > 0) {
    int g, h;
    vector<int> tree;
    scanf("%d %d", &h, &g);
    tree.resize((1 << h) - 1);
    for (int i = 0; i < tree.size(); i++) {
      scanf("%d", &tree[i]);
    }
    vector<int> depth(tree.size(), 0);
    vector<int> extra_cnt(depth.size());
    for (int j = 0; j < depth.size(); j++) {
      int left_id = (j + 1) * 2 - 1;
      int right_id = (j + 1) * 2;
      if (right_id < depth.size()) {
        depth[right_id] = depth[left_id] = depth[j] + 1;
      }
      if (depth[j] >= g) {
        int rem = h - depth[j];
        extra_cnt[j] = (1 << rem) - 1;
      } else {
        int leaves = (1 << (g - depth[j] - 1));
        extra_cnt[j] = leaves * ((1 << (h - g + 1)) - 2);
      }
    }
    vector<vector<int>> values(tree.size());
    for (int j = tree.size() - 1; j >= 0; j--) {
      int left_id = (j + 1) * 2 - 1;
      int right_id = (j + 1) * 2;
      if (right_id < tree.size()) {
        merge(values[left_id].begin(), values[left_id].end(),
              values[right_id].begin(), values[right_id].end(),
              back_inserter(values[j]));
      }
      values[j].push_back(tree[j]);
    }
    for (int j = 0; j < tree.size(); j++) {
      if (depth[j] >= g) {
        values[j].clear();
      }
    }
    vector<int> assigned_values(tree.size(), 0);
    set<int> vals;
    for (int j = tree.size() - 1; j >= 0; j--) {
      int left_id = (j + 1) * 2 - 1;
      int right_id = (j + 1) * 2;
      if (depth[j] == (g - 1)) {
        assigned_values[j] = values[j][0];
        vals.insert(assigned_values[j]);
        continue;
      }
      if (depth[j] >= g) continue;
      assigned_values[j] = *upper_bound(
          (values[j]).begin(), (values[j]).end(),
          max(assigned_values[left_id], assigned_values[right_id]));
      vals.insert(assigned_values[j]);
    }
    long long total_sum = 0;
    for (int x : assigned_values) total_sum += x;
    printf("%I64d\n", total_sum);
    for (int x = tree.size() - 1; x >= 0; x--) {
      if (vals.find(tree[x]) == vals.end()) {
        printf("%d ", x + 1);
      }
    }
    printf("\n");
  }
  return 0;
}
