#include <bits/stdc++.h>
using namespace std;
int n, src, dst;
list<pair<int, int>> adj[200001];
vector<bool> visited(200001, 0), visited1(200001, 0);
long long ans = 1, mod = 1e9 + 7, currn, curre, flag, cnt;
void DFS(int s) {
  currn++;
  visited[s] = 1;
  list<pair<int, int>>::iterator it;
  for (it = adj[s].begin(); it != adj[s].end(); it++) {
    if (!visited1[it->second]) {
      if (s == it->first) flag = 1;
      curre++;
      visited1[it->second] = 1;
      if (!visited[it->first]) DFS(it->first);
    }
  }
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> src >> dst;
    adj[src].push_back(make_pair(dst, cnt));
    adj[dst].push_back(make_pair(src, cnt++));
  }
  for (int i = 1; i <= 2 * n; i++) {
    if (!visited[i]) {
      DFS(i);
      if (currn > curre) {
        ans *= currn;
        ans %= mod;
      } else {
        if (!flag) {
          ans *= 2;
          ans %= mod;
        }
      }
      currn = curre = flag = 0;
    }
  }
  cout << ans;
  return 0;
}
