#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &os, const pair<T, T> &p) {
  return os << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream &operator<<(ostream &os, const pair<const T, T> &p) {
  return os << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream &operator<<(ostream &os, const array<T, 3> &p) {
  return os << "(" << p[0] << "," << p[1] << "," << p[2] << ")";
}
template <class T>
ostream &operator<<(ostream &os, const vector<T> &p) {
  for (auto x : p) os << x << ' ';
  return os;
}
const double EPS = 1e-9;
const double PI = acos(-1);
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
const long long mod = 1e9 + 7;
const int SZ = 2e5 + 20;
int ciclo[SZ];
int custo[SZ];
int go[SZ];
int vis[SZ];
int dfs1(int v) {
  if (ciclo[v]) return ciclo[v];
  if (vis[v]) return ciclo[v] = v;
  vis[v] = 1;
  return ciclo[v] = dfs1(go[v]);
}
int aux;
int tempo;
void dfs(int v) {
  if (vis[v] < tempo) {
    aux = 0;
    return;
  }
  if (vis[v] == tempo) return;
  vis[v] = tempo;
  aux = min(aux, custo[v]);
  dfs(go[v]);
}
int main() {
  int n;
  scanf(" %d", &n);
  for (int i = 1; i < n + 1; i++) {
    scanf(" %d", &custo[i]);
  }
  for (int i = 1; i < n + 1; i++) {
    scanf(" %d", &go[i]);
  }
  for (int i = 1; i < n + 1; i++) dfs1(i);
  long long res = 0;
  memset(vis, INF, sizeof(vis));
  for (int i = 1; i < n + 1; i++) {
    aux = INF;
    tempo += 2;
    dfs(ciclo[i]);
    res += aux;
  }
  cout << res << '\n';
  return 0;
}
