#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int tot,all;
int d[201],p[201];
int dp[201][881];
int last[881][881];
struct Node{
int next,val;
}edge[80001];
void dfs(int x,int sum1,int sum2){
if(x==0){
cout<<"Best jury has value "<<sum1<<" for prosecution and value "<<sum2<<" for defence:"<<endl;
return;
}
dfs(edge[x].next,sum1+d[edge[x].val],sum2+p[edge[x].val]);
cout<<' '<<edge[x].val;
}
int main(){
int n,m;
cin>>n>>m;
while(n && m){
tot++;
cout<<"Jury #"<<tot<<endl;
all=0;
for(int i=1;i<=n;i++) cin>>d[i]>>p[i];
memset(dp,0xcf,sizeof(dp));
memset(last,0,sizeof(last));
dp[0][400]=0;
for(int i=1;i<=n;i++){
for(int j=m;j>0;j--){
int maxn=(d[i]-p[i]);
for(int k=-400;k<=400;k++){
if(k-maxn+400>800 || k-maxn+400<0) continue;
if(dp[j][k+400]<dp[j-1][k-maxn+400]+d[i]+p[i]){
dp[j][k+400]=dp[j-1][k-maxn+400]+d[i]+p[i];
edge[++all].val=i;
edge[all].next=last[j-1][k-maxn+400];
last[j][k+400]=all;
}
}
}
}
for(int i=0;i<=400;i++){
if(dp[m][400+i]>=0 || dp[m][400-i]>=0){
if(dp[m][400+i]>dp[m][400-i]) dfs(last[m][400+i],0,0);
else dfs(last[m][400-i],0,0);
cout<<endl<<endl;
break;
}
}
cin>>n>>m;
}
return 0;
}