#include <bits/stdc++.h>
int64_t imax(const int64_t a, const int64_t b) { return std::max(a, b); }
int64_t imin(const int64_t a, const int64_t b) { return std::min(a, b); }
std::vector<int> irange(const int begin, const int end) {
  std::vector<int> ret;
  for (int i = begin; i <= end; i++) {
    ret.push_back(i);
  }
  return ret;
}
template <typename T>
void printvec(const std::vector<T>& vec) {
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << " ";
  }
  std::cout << std::endl;
}
int N;
std::vector<int64_t> A, C;
const int MAX_N = 2e5 + 10;
bool checked[MAX_N] = {};
int64_t find_min(const int b) {
  std::set<int> st;
  int p = b;
  st.insert(p);
  int64_t ret = C[p];
  while (st.count(A[p]) == 0) {
    p = A[p];
    ret = imin(ret, C[p]);
    st.insert(p);
  }
  assert(A[p] == b);
  return ret;
}
int main(int argc, char** argv) {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  std::cout << std::fixed << std::setprecision(15);
  std::cin >> N;
  C.resize((N) + 1);
  for (int i = (1); i <= (N); i++) {
    std::cin >> C[i];
  };
  A.resize((N) + 1);
  for (int i = (1); i <= (N); i++) {
    std::cin >> A[i];
  };
  int64_t ret = 0;
  for (int64_t i = ((int64_t)1); i <= ((int64_t)N); i++) {
    if (!checked[i]) {
      std::set<int> st;
      int p = i;
      st.insert(p);
      while (!checked[p] && st.count(A[p]) == 0) {
        p = A[p];
        st.insert(p);
      }
      if (!checked[p]) {
        ret += find_min(p);
      }
      for (int j : st) {
        checked[j] = true;
      }
    }
  }
  std::cout << ret << std::endl;
  return 0;
}
