#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C& _a4, C _b4) {
  _a4 = min(_a4, _b4);
}
template <class C>
void maxi(C& _a4, C _b4) {
  _a4 = max(_a4, _b4);
}
bool occup[201000];
bool vis[201000];
vector<int> E[201000];
int c[201000];
int d[201000];
int n;
const long long mod = 1e9 + 7;
int dfs(int x) {
  int r = 1;
  vis[x] = true;
  for (int y : E[x]) r += dfs(y);
  return r;
}
int p[201000];
int Find(int x) {
  if (p[x] == x)
    return x;
  else
    return p[x] = Find(p[x]);
}
void Union(int a, int b) { p[Find(a)] = Find(b); }
int main() {
  scanf("%d", &n);
  int ncykli = 0;
  for (int i = (0); i <= ((int)(n)-1); i++) {
    scanf("%d%d", &c[i], &d[i]);
    --c[i];
    --d[i];
    E[d[i]].push_back(c[i]);
    occup[c[i]] = true;
    if (c[i] == d[i]) --ncykli;
  }
  long long res = 1;
  for (int i = (0); i <= ((int)(2 * n) - 1); i++) {
    if (occup[i] == false) res = res * dfs(i) % mod;
  }
  for (int i = (0); i <= ((int)(2 * n) - 1); i++) p[i] = i;
  for (int i = (0); i <= ((int)(n)-1); i++)
    if (vis[c[i]] == false) Union(c[i], d[i]);
  for (int i = (0); i <= ((int)(2 * n) - 1); i++)
    if (p[i] == i && vis[i] == false) ++ncykli;
  assert(ncykli >= 0);
  for (int i = (0); i <= ((int)(ncykli)-1); i++) res = res * 2 % mod;
  printf("%lld\n", res);
}
