#include<stdio.h>
typedef struct
{
int T;
int P;
int flag;
}LNode;
//倒着安排活动使损失最小,如果刚好有活动截止就安排它,不然安排其他受益最大的活动,若都过期了就安排损失最小的活动。
int main()
{
LNode A[20];
int X[20];
int n,i,j,k;
int sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d %d",&A[i].T,&A[i].P);
A[i].flag=0;
}
for(i=n;i>=1;i--)
{
int isover=1,isok=0;
int mini,maxi,min,max;
max=-1,min=10000;
for(j=1;j<=n;j++)
{
if(A[j].flag==0&&A[j].T==i)//如果刚好有个活动截止,就直接安排
{
X[i]=j;
sum+=A[j].P;
A[j].flag=1;
isover=0;
break;
}
if(A[j].flag==0&&A[j].T<i)//过期的活动
{
if(A[j].P<min)
{
mini=j;
min=A[j].P;
}
}
if(A[j].flag==0&&A[j].T>=i)//没过期的活动
{
if(A[j].P>max)
{
maxi=j;
max=A[j].P;
isok=1;
}
}
}
if(isover==0)
continue;
if(isok==1)
{
X[i]=maxi;
sum+=A[maxi].P;
A[maxi].flag=1;
}
else
{
X[i]=mini;
A[mini].flag=1;
}
}
printf("%d: ",sum);
for(i=1;i<=n;i++)
{
printf("%d ",X[i]);
}
return 0;
}