#include<map>
#include<list>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define il inline
#define ll long long
#define rl register ll
#define ri register int
#define rc register char
#define re register
#define mod 1000007
using namespace std;
int n,m;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
return x*f;
}
struct goods
{
int num,v;
}a[1010],b[1010];
bool cmp(goods a,goods b)
{
return a.v>b.v;
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
// printf("%dM\n",(sizeof(dp) >> 20))
cin>>n>>m;
int o1=0,o2=0;
int t1=0,t2=0;
for(re int i=1;i<=n;i++)
{
int x,y;
x=read(),y=read();
if(y==1)
a[++o1].v=x,a[o1].num=i,t1+=x;
else
b[++o2].v=x,b[o2].num=i,t2+=x;
}
// cout<<n-m+o1-1<<' '<<endl;
// cout<<endl;
if(o1<=m-1)
{
double ans=t1/2.0;
ans+=t2;
printf("%.1f\n",ans);
// cout<<o1<<' '<<o2<<endl;
// cout<<endl;
// for(re int i=1;i<=o2;i++)
// cout<<b[i].num<<' ';
// cout<<endl;
// cout<<endl;
for(re int i=1;i<=o1;i++)
cout<<1<<' '<<a[i].num<<'\n';
for(re int i=1;i<m-o1;i++)
cout<<1<<' '<<b[i].num<<'\n';
cout<<n-m+o1<<' ';
for(re int i=m-o1;i<=o2;i++)
cout<<b[i].num<<' ';
}
else
{
int op=t1+t2,t3=0;
sort(a+1,a+1+o1,cmp);
for(re int i=1;i<m;i++)
t3+=a[i].v;
int u=99999999;
for(re int i=m;i<=o1;i++)
u=min(u,a[i].v);
for(re int i=1;i<=o2;i++)
u=min(u,b[i].v);
double ans1=op-t3+t3/2.0;
//cout<<u<<endl;
//cout<<t1<<' '<<t2<<' '<<t3<<' '<<ans1-u/2.0;
printf("%.1f\n",ans1-u/2.0);
for(re int i=1;i<m;i++)
cout<<1<<' '<<a[i].num<<'\n';
cout<<n-m+1<<' ';
for(re int i=m;i<=o1;i++)
cout<<a[i].num<<' ';
for(re int i=1;i<=o2;i++)
cout<<b[i].num<<' ';
}
return 0;
}
求调(码写的太丑了,见谅)