#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

const int MX=200005,md=1000000007;
int n,f,a,b,c,s[MX],stk[MX],stc,w[MX],vis[MX];
int ans=1,res;
struct edge{int t,nxt,w;}e[MX<<1];int hed[MX],ec;
void ade(int x,int t,int w){e[++ec]=(edge){t,hed[x],w},hed[x]=ec;}
#define FE(i,k) for(int i=hed[k];i;i=e[i].nxt)
#define v e[i].t
inline int pw(int x,int y){
	int a=1;
	while(y){
		if(y&1)a=(LL)a*x%md;
		x=(LL)x*x%md,y>>=1;
	}
	return a;	
}
#define inv(x) pw(x,md-2)
void dfs1(int k, int fa){
	vis[k]=2,stk[++stc]=k;
	FE(i,k)if(v!=fa){
		if(vis[v]==2){
			a=k,b=v,c=e[i].w;
			int t=stc;
			do{
				--t;
				if(w[t]>c)a=stk[t],b=stk[t+1],c=w[t];
			}while(stk[t]!=v);
			++f;
		}else if(!vis[v])w[stc]=e[i].w,dfs1(v,k);
	}
	vis[k]=1,--stc;
}
void dfs2(int k,int fa,int w) {
	s[k]=1;
	FE(i,k)if(v!=fa&&v!=a&&(k!=a||v!=b)){
		dfs2(v,k,e[i].w);
		if(e[i].w<w)s[k]+=s[v];
	}
	res=(LL)res*inv(s[k])%md;
}
int main(){
	int i,x,y,k;
	cin>>n;
	for(i=1;i<=n*2;i++)cin>>x>>y,ade(x,y+n,x+y),ade(y+n,x,x+y);
	n<<=1;
	for(i=1;i<=n;i++)ans=(LL)ans*i%md;
	for(i=1;i<=n;i++)if(!vis[i]){
		f=0,dfs1(i,0);
		if(f!=1){ans=0;break;}
		res=1,dfs2(a,0,c);
		k=res;
		swap(a,b);
		res=1,dfs2(a,0,c);
		ans=(LL)ans*(k+res)%md;
	}
	cout<<ans<<endl;
	return 0;
}