#include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
constexpr int N = 214514;
int n;
int a[N];
int c[N];
vector<int> tree[N];
bool vis[N];
int id[N];
long long dp[N][2];
long long f[N][2][2];
bool rvis[N];
vector<int> ring;
long long res;
void dfs (int now) {
dp[now][1] = c[now];
for (auto son : tree[now]) {
if (rvis[son]) {
continue;
}
dfs (son);
dp[now][0] += dp[son][1];
dp[now][1] += min (dp[son][0], dp[son][1]);
}
}
int main () {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
tree[a[i]].push_back(i);
}
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
for (int i = 1; i <= n; i++) {
if (vis[i]) {
continue;
}
int ti = i;
while (!vis[ti]) {
vis[ti] = true;
id[ti] = i;
ti = a[ti];
}
if (id[ti] < i) {
continue;
}
ring.clear();
while (!rvis[ti]) {
rvis[ti] = true;
ring.push_back(ti);
ti = a[ti];
}
int l = 0;
int r = *ring.rbegin();
if (ring.size() == 1) {
dfs (r);
res += dp[r][1] - c[r];
continue;
}
bool flag = false;
for (auto ri : ring) {
dfs (ri);
if (flag) {
f[ri][0][0] = f[l][1][0] + dp[ri][0];
f[ri][0][1] = f[l][1][1] + dp[ri][0];
f[ri][1][0] = min (f[l][0][0], f[l][1][0]) + dp[ri][1];
f[ri][1][1] = min (f[l][0][1], f[l][1][1]) + dp[ri][1];
}
else {
f[ri][0][0] = dp[ri][0];
f[ri][0][1] = 1e18;
f[ri][1][1] = dp[ri][1];
f[ri][1][0] = 1e18;
flag = true;
}
l = ri;
}
res += min (f[r][0][1], min (f[r][1][1], f[r][1][0]));
}
cout << res << endl;
return 0;
}