#include <bits/stdc++.h>
using namespace std;
const int INF = (int)1E9;
const long long LINF = (long long)1E18;
int INP, AM;
char BUF[(1 << 10) + 1], *inp = BUF;
template <typename T>
T gcd(T a, T b) {
  return (b == 0) ? abs(a) : gcd(b, a % b);
}
template <typename T>
inline T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
const char DEBUG_PARAM[] = "__LOCAL_TESTING";
const char IN[] = "input.txt";
const char OUT[] = "output.txt";
int ntest = 0, test;
inline void init();
inline void run();
inline void stop() { ntest = test - 1; }
int main(int argc, char* argv[]) {
  if (argc > 1 && strcmp(argv[1], DEBUG_PARAM) == 0) {
    freopen(IN, "r", stdin);
  }
  init();
  if (ntest == 0) {
    puts("ntest = ?");
    return 0;
  }
  for (test = 1; test <= ntest; test++) {
    run();
  }
  return 0;
}
const int dx[] = {-1, 0, 0, 1};
const int dy[] = {0, -1, 1, 0};
const long double EPS = 1E-9;
const long long MODULO = 1000000007LL;
inline void init() { ntest = 1; }
const int maxn = 1000 + 5;
vector<pair<int, int> > stool, pencil;
vector<int> res[maxn];
bool ok[maxn];
int cost[maxn];
int n, k;
double add(const vector<int>& r) {
  bool dc = false;
  double add = 0;
  double minx = 1000000000;
  for (typeof((r).begin()) it = (r).begin(); it != (r).end(); ++it) {
    if (ok[*it]) dc = true;
    add += cost[*it];
    minx = min(minx, (double)cost[*it]);
  }
  if (dc) add -= minx / 2;
  return add;
}
double cal() {
  double r = 0;
  for (int i = (1); i <= (k); i++) r += add(res[i]);
  return r;
}
void solve() {
  sort((stool).begin(), (stool).end());
  sort((pencil).begin(), (pencil).end());
  if (((int)(stool).size()) >= k) {
    int s = ((int)(stool).size());
    for (int i = (s - 1); i >= (0); i--) {
      if (i - s + 1 + k > 0)
        res[i - s + 1 + k].push_back(stool[i].second);
      else {
        res[1].push_back(stool[i].second);
      }
    }
    for (typeof((pencil).begin()) it = (pencil).begin(); it != (pencil).end();
         ++it) {
      res[1].push_back(it->second);
    }
  } else {
    int s = ((int)(stool).size());
    for (int i = 0; i < (s); i++) {
      res[i + 1].push_back(stool[i].second);
    }
    for (int i = (s + 1); i <= (k); i++) {
      res[i].push_back(pencil[i - s - 1].second);
    }
    for (int i = (k - s); i <= (((int)(pencil).size()) - 1); i++)
      res[k].push_back(pencil[i].second);
  }
  printf("%.1lf\n", cal());
  for (int i = (1); i <= (k); i++) {
    cout << ((int)(res[i]).size()) << " ";
    for (int j = 0; j < (((int)(res[i]).size())); j++) {
      cout << res[i][j];
      if (j != ((int)(res[i]).size()) - 1) cout << " ";
    }
    cout << endl;
  }
}
inline void run() {
  cin >> n >> k;
  int c, t;
  for (int i = (1); i <= (n); i++) {
    cin >> c >> t;
    cost[i] = c;
    if (t == 1) {
      stool.push_back(make_pair(c, i));
      ok[i] = true;
    } else
      pencil.push_back(make_pair(c, i));
  }
  solve();
}
