#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
namespace IO_Optimization {
inline int read() {
  int X = 0, w = 0;
  char ch = 0;
  while (!isdigit(ch)) {
    w |= ch == '-';
    ch = getchar();
  }
  while (isdigit(ch)) {
    X = (X << 3) + (X << 1) + (ch ^ 48);
    ch = getchar();
  }
  return w ? -X : X;
}
inline void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
}  // namespace IO_Optimization
using namespace IO_Optimization;
int n, k;
double sum;
struct Node {
  int num, pos;
} a[2000 + 2], b[2000 + 2];
struct Trans {
  int s[2000 + 2];
} ans[2000 + 2];
int tot1, tot2;
inline bool cmp(Node x, Node y) { return x.num > y.num; }
int main() {
  n = read(), k = read();
  for (register int i = 1; i <= n; ++i) {
    int x = read(), y = read();
    if (y == 1)
      a[++tot1].num = x, a[tot1].pos = i;
    else
      b[++tot2].num = x, b[tot2].pos = i;
  }
  sort(a + 1, a + 1 + tot1, cmp);
  int noww = k - 1 < tot1 ? k - 1 : tot1;
  for (register int i = 1; i <= noww; ++i) {
    ans[i].s[++ans[i].s[0]] = a[i].pos;
    sum += a[i].num * 0.5;
  }
  if (tot1 <= k - 1) {
    for (register int i = 1; i <= tot2; ++i) {
      int nowww = tot1 + i < k ? tot1 + i : k;
      sum += b[i].num;
      ans[nowww].s[++ans[nowww].s[0]] = b[i].pos;
    }
  } else {
    int minn = 1e9;
    for (register int i = k; i <= tot1; ++i) {
      sum += a[i].num;
      ans[k].s[++ans[k].s[0]] = a[i].pos;
      minn = a[i].num < minn ? a[i].num : minn;
    }
    for (register int i = 1; i <= tot2; ++i) {
      sum += b[i].num;
      ans[k].s[++ans[k].s[0]] = b[i].pos;
      minn = b[i].num < minn ? b[i].num : minn;
    }
    sum -= minn * 0.5;
  }
  printf("%.1lf\n", sum);
  for (register int i = 1; i <= k; ++i, puts("")) {
    write(ans[i].s[0]);
    cout << " ";
    for (register int j = 1; j <= ans[i].s[0]; ++j) {
      write(ans[i].s[j]);
      cout << " ";
    }
  }
  return 0;
}
