#include<bits/stdc++.h>
using namespace std;
#define sc(d) scanf("%d",&d)
#define ll long long
int c[200005];
int g[200005];
int n;
struct DisjointSet {
vector<int>father, rank;
DisjointSet(int n) :father(n+1), rank(n+1) {
for (int i = 1; i <= n; ++i) {
father[i] = i;
}
}
int find(int v) {
return father[v] = father[v] == v ? v : find(father[v]);
}
void merge(int x, int y) {
int a = find(x), b = find(y);
if (rank[a] < rank[b]) {
father[a] = b;
}
else {
father[b] = a;
if (rank[b] == rank[a]) {
++rank[a];
}
}
/*for (int i = 1; i <= n; i++) {
printf("%d ", father[i]);
}
printf("\n");*/
}
};
int v[200005];
int visited[200005];
ll ans=0;
int dfs(int ind,int minc=200000) {
v[ind]++;
if (v[ind] >= 3) {
ans+=minc;
return 1;
}
if(v[ind] ==2 )
dfs(g[ind],min(minc, c[ind]));
else
dfs(g[ind], minc);
return 0;
}
int main() {
sc(n);
for (int i = 1; i <= n; i++) {
sc(c[i]);
}
for (int i = 1; i <= n; i++) {
sc(g[i]);
}
DisjointSet d(n);
for (int i = 1; i <= n; i++) {
d.merge(i, g[i]);
}
/*for (int i = 1; i <= n; i++) {
printf("%d ", d.father[i]);
}*/
for (int i = 1; i <= n; i++) {
if (visited[d.find(i)]==0) {
visited[d.find(i)] = 1;
dfs(d.find(i));
}
}
printf("%lld\n",ans);
return 0;
}