#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#include <set>
#include <queue>
#include <map>
#include <numeric>
using namespace std;
typedef long long int ll;

ll mod=1e9+7;

ll mod_pow(ll a,ll b){
	a%=mod;
	if(b==0)return 1;
	if(b==1)return a;
	ll res=mod_pow(a,b/2)%mod;
	res*=res; res%=mod;
	if(b%2)res*=a;
	return res%mod;
}

struct perm{
private:
	int sz;
	vector<ll> p,invp;
public:
	perm(int n){
		sz=n+1;
		p.resize(sz),invp.resize(sz);
		p[0]=1;
		for(int i=1;i<=sz-1;i++){
			p[i]=p[i-1]*i%mod;
		}
		invp[sz-1]=mod_pow(p[sz-1],mod-2);
		for(int i=sz-2;i>=0;i--){
			invp[i]=invp[i+1]*(i+1)%mod;
		}
	}
	ll comb(ll x,ll y){
		if(x<y||y<0)return 0;
		return (p[x]*invp[x-y]%mod)*invp[y]%mod;
	}
};
perm p(400040);

int main(){
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
	int n,x,y; cin >> n >> x >> y;
	vector<pair<int,int>> v,vv;
	vector<int> mi(n,1e9);
	ll res=1;
	for(int i=0;i<n;i++){
		int c,w; cin >> c >> w;
		c--;
		v.push_back({c,w});
		mi[c]=min(mi[c],w);
	}
	for(int i=0;i<n;i++){
		if(mi[i]<1e9){
			vv.push_back({mi[i],i});
		}
	}
	sort(vv.begin(),vv.end());
	if(vv.size()==1){
		cout << 1 << endl;
		return 0;
	}
	// 最小値は2個みとけばおっけー
	// for文で0~2回すと実装楽そう
	vector<bool> can(n,0),colar(n,0);
	for(int i=0;i<n;i++){
		for(int j=0;j<2;j++){
			if(v[i].first!=vv[j].second&&v[i].second+vv[j].first<=y){
				can[i]=1;
				colar[v[i].first]=1;
			}
		}
	}
	for(int i=0;i<n;i++){
		if(colar[v[i].first]&&v[i].second+mi[v[i].first]<=x)can[i]=1;
	}
	vector<int> num(n,0);
	int sum=0;
	for(int i=0;i<n;i++){
		if(can[i]){
			sum++; num[v[i].first]++;
		}
	}
	for(int i=0;i<n;i++){
		(res*=p.comb(sum,num[i]))%=mod;
		sum-=num[i];
	}
	cout << res%mod << endl;
}