#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct edge{
public:
    int to,cost;
};

vector<edge> G[100001];
int n;
bool passed[100001];
const int mod=10007;

vector<int> p;
void dfs(int s,bool first,int from){
    if(!first)
        passed[s]=true;
    for(int i = 0; i < G[s].size(); i++){
        edge &e=G[s][i];
        if(passed[e.to]||e.to==from)
            continue;
        p.push_back(e.cost);
        dfs(e.to,false,s);
        break;
    }
}

int main(){
    while(cin>>n&&n!=0){
        for(int i = 0; i < n; i++)
            G[i].clear();
        fill(passed,passed+n,false);
        for(int i = 0; i < n; i++){
            for(int j = 0; j < 2; j++){
                int to,cost;
                cin>>to>>cost;
                edge e;
                e.to=to;e.cost=cost;
                G[i].push_back(e);
            }
        }
        int mul=1;
        for(int i = 0; i < n; i++){
            if(passed[i])
                continue;
            p.clear();
            dfs(i,true,-1);
            // ツづづ個陛督づーツ催ュツづゥツつゥ
            int maxNum=-1;
            int sum=0;
            int cnt=0;
            for(int j = 0; j < p.size(); j++){
                if(maxNum==-1||maxNum<p[j]){
                    maxNum=p[j];
                    cnt=1;
                }
                else if(maxNum==p[j])
                    cnt++;
            }
            mul*=cnt;
            mul%=mod;
        }
        cout<<mul%mod<<endl;
    }

    return 0;
}