#include<bits/stdc++.h>
using namespace std;

using ui=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;

const int MOD=1e9+7;

void solve()
{//由于数据量比较大 我们需要使用空间优化 
//设置两个数组 一个dp[j]表示当容量为j时可取到的最大价值
//一个cnt[j]表示当容量为j时可取到的最大方案数
//和01背包基本思路一样
//当dp[j]<dp[j-w[i]]+v[i] 我们更新dp[j]和cnt[j]
//注意更新后的cnt[j]不一定比原来的大
//当dp[j]=dp[j-w[i]]+v[i] 我们令cnt[j]的方案数累积
//即加上cnt[j-w[i]]
	int n,m;
	cin >> n >> m;
	vector<int>dp(m+1,0),cnt(m+1,1),w(n+1,0),v(n+1,0);
	for(int i=1;i<=n;i++) cin >> w[i] >> v[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=w[i];j--)
		{
			if(dp[j]<dp[j-w[i]]+v[i])
			{
				dp[j]=dp[j-w[i]]+v[i];
				cnt[j]=cnt[j-w[i]];
			}
			else if(dp[j]==dp[j-w[i]]+v[i])
			{
				cnt[j]=(cnt[j]+cnt[j-w[i]])%MOD;
			}
		}
	}
	cout << cnt[m] << "\n";
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t=1;
	cin >> t;

	while(t--)
	{
		solve();
	}
	return 0;
}