#include <bits/stdc++.h>
using namespace std;
struct Node {
  int kind, ind;
  double p;
} node[1100];
int N, K, num;
int cmp(const void *a, const void *b) {
  if (((Node *)a)->kind == ((Node *)b)->kind) {
    if (((Node *)a)->p < ((Node *)b)->p)
      return 1;
    else if (((Node *)a)->p > ((Node *)b)->p)
      return -1;
    return 0;
  }
  return ((Node *)a)->kind - ((Node *)b)->kind;
}
int main() {
  int i, j;
  cin >> N >> K;
  for (i = 1; i <= N; i++) {
    cin >> node[i].p >> node[i].kind;
    if (node[i].kind == 1) num++;
    node[i].ind = i;
  }
  qsort(node + 1, N, sizeof(Node), cmp);
  if (num >= K) {
    double ans = 0;
    for (i = 1; i < K; i++) ans -= node[i].p;
    if (node[num].p < node[N].p)
      ans -= node[num].p;
    else
      ans -= node[N].p;
    ans /= 2;
    for (i = 1; i <= N; i++) ans += node[i].p;
    printf("%.1f\n", ans);
    for (i = 1; i < K; i++) printf("1 %d\n", node[i].ind);
    printf("%d", N - K + 1);
    for (i = K; i <= N; i++) printf(" %d", node[i].ind);
    printf("\n");
  } else {
    double ans = 0;
    for (i = 1; i <= num; i++) ans -= node[i].p;
    ans /= 2;
    for (i = 1; i <= N; i++) ans += node[i].p;
    printf("%.1f\n", ans);
    for (i = 1; i <= num; i++) printf("1 %d\n", node[i].ind);
    for (; i < K; i++) printf("1 %d\n", node[i].ind);
    printf("%d", N - K + 1);
    for (i = K; i <= N; i++) printf(" %d", node[i].ind);
    printf("\n");
  }
}
