#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

#define FALSE 0
#define TRUE  1

#define MIN(a, b) ((a)<(b) ?  (a) : (b))
#define MAX(a, b) ((a)>(b) ?  (a) : (b))
#define ABS(a) 	((a)< 0  ? -(a) : (a))
#define IMPAR(a)	((a)&1)
#define CTOI(a)	((a) - '0')
#define ITOC(a)	((a) + '0')

#define MAX_TAM	100

typedef struct {int custo, votos;} TMelhoria;

// Variaveis do knapsack
int xi, xw, MW, C[MAX_TAM + 1][10001], V[MAX_TAM + 1][10001];

int main()
{	int N, T, L, l;
	TMelhoria melhorias[MAX_TAM];
	char possivel;
	unsigned t = clock();
	
	while (scanf("%d %d", &L, &T) != EOF)
	{	for (l = 0, possivel = FALSE; l < L; l++)
		{	scanf("%d %d", &melhorias[l].votos, &melhorias[l].custo);
			if (melhorias[l].custo <= T )
				possivel = TRUE;
		}
/*		
		for (l = 0; l < L; l++)
			printf("%d %d\n", melhorias[l].votos, melhorias[l].custo);
		printf("\n\n");
*/		
		if (!possivel)
			puts("-1");
		else
		{ //The solution can be found in C[N][W];
			MW = T;			// Tamanho da mochila
	
			for (xi = 0; xi <= L; xi++)
				C[xi][0] = V[xi][0] = 0;
			
			for (xw = 0; xw <= MW; xw++) 
				C[0][xw] = V[0][xw] = 0;
			
			for (xi = 1; xi <= L; xi++)
				for (xw = 1; xw <= MW; xw++)
				{	if (melhorias[xi - 1].custo > xw)
					{	C[xi][xw] = C[xi - 1][xw];
						V[xi][xw] = V[xi - 1][xw];
					}
					else
						if (C[xi - 1][xw] > C[xi - 1][xw - melhorias[xi - 1].custo] + melhorias[xi - 1].votos)
						{	C[xi][xw] = C[xi - 1][xw];
							V[xi][xw] = V[xi - 1][xw];
						}
						else
						{	C[xi][xw] = C[xi - 1][xw - melhorias[xi - 1].custo] + melhorias[xi - 1].votos;
							V[xi][xw] = V[xi - 1][xw - melhorias[xi - 1].custo] + melhorias[xi - 1].custo;
						}
				}
			printf("%d\n", C[L][MW]);
/*			
			for (xi = 0; xi <= L; xi++)
			{	for (xw = 0; xw <= MW; xw++)
					printf("%2d ", C[xi][xw]);
				printf("\n");
			}
			printf("*************************\n");
*/		}
	}
	
//	printf("\n\n%d\n ", (clock()-t) / CLK_TCK);
	
	return 0;
}