const int MAXN=1e5+5;
const LL inf=1e18;
struct Edge{
int to,next;
}edge[MAXN];
int head[MAXN],edge_cnt;
void Insert(int u,int v){
edge[++edge_cnt]=Edge{v,head[u]};
head[u]=edge_cnt;
}
int fa[MAXN],a[MAXN],b[MAXN];
bool inque[MAXN],node_vis[MAXN],node_cyc[MAXN];
LL dp[MAXN][3];
vector<int> cyc;
void dfs(int u){
LL s1=0,s2=inf;
node_vis[u]=true;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(node_cyc[v])continue;
dfs(v);
LL w=min({dp[v][0],dp[v][1],dp[v][2]});
s1+=w;
s2=min(s2,dp[v][2]-w);
}
dp[u][0]=s1+s2;
dp[u][1]=b[u]+s1;
dp[u][2]=a[u]+s1;
}
LL dp2[MAXN][3];
LL cal1(){
int u=cyc[0];
dp2[u][0]=min({dp[u][0],dp[u][1]-b[u],dp[u][2]-a[u]});
dp2[u][1]=dp[u][1];
dp2[u][2]=dp[u][2];
_for(i,1,cyc.size()){
int u=cyc[i],p=cyc[i-1];
dp2[u][0]=dp2[p][2]+min({dp[u][0],dp[u][1]-b[u],dp[u][2]-a[u]});
dp2[u][0]=min(dp2[u][0],dp[u][0]+min(dp2[p][0],dp2[p][1]));
dp2[u][1]=dp[u][1]+min({dp2[p][0],dp2[p][1],dp2[p][2]});
dp2[u][2]=dp[u][2]+min({dp2[p][0],dp2[p][1],dp2[p][2]});
}
return dp2[*cyc.rbegin()][2];
}
LL cal2(){
int u=cyc[0];
dp2[u][0]=dp[u][0];
dp2[u][1]=dp[u][1];
dp2[u][2]=dp[u][2];
_for(i,1,cyc.size()){
int u=cyc[i],p=cyc[i-1];
dp2[u][0]=dp2[p][2]+min({dp[u][0],dp[u][1]-b[u],dp[u][2]-a[u]});
dp2[u][0]=min(dp2[u][0],dp[u][0]+min(dp2[p][0],dp2[p][1]));
dp2[u][1]=dp[u][1]+min({dp2[p][0],dp2[p][1],dp2[p][2]});
dp2[u][2]=dp[u][2]+min({dp2[p][0],dp2[p][1],dp2[p][2]});
}
return min({dp2[*cyc.rbegin()][0],dp2[*cyc.rbegin()][1],dp2[*cyc.rbegin()][2]});
}
LL solve(int u){
cyc.clear();
stack<int> st;
int pos=u;
while(!inque[pos]){
inque[pos]=true;
st.push(pos);
pos=fa[pos];
}
node_cyc[pos]=true;
cyc.push_back(pos);
while(st.top()!=pos){
int tmp=st.top();
node_cyc[tmp]=true;
cyc.push_back(tmp);
st.pop();
}
reverse(cyc.begin(),cyc.end());
for(int u:cyc)
dfs(u);
return min(cal1(),cal2());
}
int main()
{
int n=read_int();
_rep(i,1,n)
a[i]=read_int();
_rep(i,1,n)
b[i]=a[i]-read_int();
_rep(i,1,n){
fa[i]=read_int();
Insert(fa[i],i);
}
LL ans=0;
_rep(u,1,n){
if(!node_vis[u])
ans+=solve(u);
}
enter(ans);
return 0;
}