#include <bits/stdc++.h>
using namespace std;
template <class T>
inline int cMin(T& a, T b) {
  return b < a ? a = b, 1 : 0;
}
template <class T>
inline int cMax(T& a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <class T>
inline string to_str(T v) {
  ostringstream os;
  os << v;
  return os.str();
}
const double pi = acos(-1.0);
const double eps = 1e-9;
template <class T>
inline T isqr(T v) {
  return v * v;
}
template <class T>
inline T iabs(T v) {
  return v < 0 ? -v : v;
}
template <class T>
inline int isgn(T v) {
  return iabs(v) <= eps ? 0 : (v < 0 ? -1 : 1);
}
template <typename T>
inline T next() {
  static char buf[64];
  scanf("%s", buf);
  istringstream is(buf);
  T v;
  is >> v;
  return v;
}
inline int nextInt() {
  int v = 0;
  scanf("%d", &v);
  return v;
}
int N, K;
pair<int, pair<int, int> > src[1024];
vector<pair<int, pair<int, int> > > adj[1024];
int curK = 0;
vector<pair<int, pair<int, int> > > Rem;
vector<pair<int, pair<int, int> > > S, P;
long long total = 0;
int main(int argc, char* argv[]) {
  scanf("%d%d", &N, &K);
  for (int i = 1; i <= (int)(N); ++i) {
    pair<int, pair<int, int> > t;
    scanf("%d%d", &t.first, &t.second.first);
    total += t.first;
    t.second.second = i;
    if (t.second.first == 1) {
      S.push_back(t);
    } else
      P.push_back(t);
  }
  total *= 2;
  sort(S.begin(), S.end());
  reverse(S.begin(), S.end());
  while (S.size() > K) {
    P.push_back(S.back());
    S.pop_back();
  }
  sort(P.begin(), P.end());
  int need = K - (int)S.size();
  curK = S.size();
  for (int i = 0; i < (int)(curK); ++i) {
    adj[i].push_back(S[i]);
  }
  for (int i = 0; i < (int)(curK); ++i) {
    if (P.size() > need) {
      if (adj[i].begin()->first < P.back().first) {
        adj[i].push_back(P.back());
        P.pop_back();
      }
    }
  }
  for (int i = curK; i < K; ++i) {
    adj[i].push_back(P.back());
    P.pop_back();
  }
  while (!P.empty()) {
    adj[K - 1].push_back(P.back());
    P.pop_back();
  }
  for (int i = 0; i < (int)(curK); ++i) {
    sort(adj[i].begin(), adj[i].end());
    total -= adj[i].begin()->first;
  }
  printf("%s.%d\n", to_str(total / 2).c_str(), (total & 1) ? 5 : 0);
  for (int i = 0; i < (int)(K); ++i) {
    printf("%d", (int)adj[i].size());
    for (int k = 0; k < (int)(adj[i].size()); ++k)
      printf(" %d", adj[i][k].second.second);
    putchar('\n');
  }
  return 0;
}
