#include <bits/stdc++.h>
using namespace std;
int n,m;
//体积恰好是j的情况,表示体积要用完 
int f[1010];//记录体积恰好是j的情况下的最大价值 
int g[1010];//记录体积恰好是j的情况下的方案数
int mod = 1000000000 + 7;
int INF = 1000000;
int v,w;
int t,s;

int main(){
	cin>>n>>m;
	//背包什么都不装也是一种方案 
	for(int i = 0;i <= m;i++) g[i] = 1;
	//循环物品数 
	for(int i = 1;i <= n;i++){
		cin>>v>>w;
		//01背包循环背包容量~当前物品的体积 
		for(int j = m;j >= v;j--){
			t = max(f[j],f[j-v]+w);//选和不选的最大价值
			//判断从哪个决策转移过来的
			s = 0;
			//两个决策如果都是最优的,那么方案是就是两者之和 
			if(t == f[j]) s = (s+g[j])%mod;//没选是最优的 
			if(t == f[j-v] + w) s = (s+g[j-v])%mod;//选了是最优的 
			f[j] = t;
			g[j] = s;
		}
	} 
	
	cout<<g[m];
	return 0;
}

/**************************************************************
	Problem: 1911
	User: admin
	Language: C++
	Result: Accepted
	Time:27 ms
	Memory:2080 kb
****************************************************************/