#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 23;
const int MOD = 1e9 + 9;
const int MAXN = 1e3 + 100;
struct item {
  int val, type, id;
  bool operator<(const item &rhs) const { return val > rhs.val; }
};
vector<item> items[2];
vector<item> cart[MAXN];
int main() {
  ios_base::sync_with_stdio(0);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    item it;
    it.id = i + 1;
    cin >> it.val >> it.type;
    items[it.type - 1].push_back(it);
  }
  for (int i = 0; i < 2; ++i) {
    sort(items[i].begin(), items[i].end());
  }
  for (int i = 0; i < min((int)items[0].size(), k); ++i) {
    cart[i].push_back(items[0][i]);
  }
  for (int i = k; i < items[0].size(); ++i) {
    cart[k - 1].push_back(items[0][i]);
  }
  int pnr = items[1].size() - 1, cnr = k - 1;
  while (cnr >= 0 && cart[cnr].size() == 0) {
    cart[cnr--].push_back(items[1][pnr--]);
  }
  int pi = 0, ci = 0;
  while (pi <= pnr) {
    if (ci == k - 1 || cart[ci][0].val <= items[1][pi].val) {
      cart[ci].push_back(items[1][pi++]);
    } else {
      ++ci;
    }
  }
  double anssum = 0;
  for (int i = 0; i < k; ++i) {
    bool stool = false;
    int mn = INF;
    for (auto it : cart[i]) {
      if (it.type == 1) stool = true;
      mn = min(mn, it.val);
      anssum += it.val;
    }
    if (stool) {
      anssum -= mn / 2.0;
    }
  }
  cout.precision(1);
  cout << fixed << anssum << "\n";
  for (int i = 0; i < k; ++i) {
    cout << cart[i].size();
    for (auto it : cart[i]) {
      cout << " " << it.id;
    }
    cout << "\n";
  }
  return 0;
}
