#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[25][810],path[25][810];
int s[210],r[210],p[210],d[210];
bool yes(int j,int k,int i)
{
int pos=path[j][k];
while(pos){
if(pos==i) return false;
k-=r[pos];j--;
pos=path[j][k];
}
return true;
}
int main()
{
int n,m,ca=1;
while(scanf("%d%d",&n,&m),(n+m)){
memset(dp,-1,sizeof(dp));
memset(path,0,sizeof(path));
int end=(20*m)<<1;
for(int i=1;i<=n;i++){
scanf("%d%d",p+i,d+i);
s[i]=d[i]+p[i];
r[i]=d[i]-p[i];
}
dp[0][end>>1]=0;
for(int j=1;j<=m;j++)
for(int k=0;k<=end;k++) if(dp[j-1][k]>=0)
for(int i=1;i<=n;i++){
/*if(i>=j&&k-r[i]>=0){
int t=dp[j-1][k-r[i]];
if(t!=-1&&dp[j][k]<t+s[i]&&yes(j,k,i)){
dp[j][k]=t+s[i];
path[j][k]=i;
}
}这种转移方式不明白为什么会wa,先mark*/
if(dp[j][k+r[i]]<dp[j-1][k]+s[i])
if(yes(j-1,k,i)){
dp[j][k+r[i]]=dp[j-1][k]+s[i];
path[j][k+r[i]]=i;
}
}
int k,pos,size=0,ans[25],sd=0,sp=0,l=end>>1,ri=end>>1;
while(true){
if(dp[m][l]==-1&&dp[m][ri]==-1) {l--;ri++;}
else if(dp[m][l]==-1) {k=ri;break;}
else if(dp[m][ri]==-1) {k=l;break;}
else {k=dp[m][ri]>dp[m][l]?ri:l;break;}
}
pos=path[m][k];
while(pos){
ans[size++]=pos;
sd+=d[pos];sp+=p[pos];
k-=r[pos];m--;
pos=path[m][k];
}
sort(ans,ans+size);
printf("Jury #%d\n",ca++);
printf("Best jury has value %d for prosecution and value %d for defence:\n",sp,sd);
for(int i=0;i<size;i++) printf(" %d",ans[i]);
printf("\n\n");
}
return 0;
}