#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(),x.end()
#define dbg(x) cout<<#x<<":"<<x<<endl
#define int long long
#define MOD 1e9+7
typedef pair<int,int> P;
typedef pair<int,P> PP;
struct edge{int to,cost;};

signed main(){
  while(1){
    int n;
    cin>>n;
    if(n==0)break;
    int sum=0;
    vector<int> p(n);
    vector<vector<edge> > g(n);
    for(int i=1;i<n;i++){
	 cin>>p[i];
	 p[i]--;
    }
    for(int i=1;i<n;i++){
	 int d;
	 cin>>d;
	 g[i].pb({p[i],d});
	 g[p[i]].pb({i,d});
	 sum+=d;
    }
    vector<int> used(n,0);
    vector<int> ev;
    int dsum=0;
    for(int i=0;i<n;i++){
	 if(g[i].size()==1){
	   used[i]=1;
	   dsum+=g[i][0].cost;
	   ev.pb(i);
	 }
    }
    for(int i=0;i<ev.size();i++){
	 int to=g[ev[i]][0].to;
	 for(int j=0;j<g[to].size();j++){
	   if(g[to][j].to==ev[i]){
		g[to].erase(g[to].begin()+j);
		break;
	   }
	 }
    }
  
    int s;
    for(int i=0;i<n;i++){
	 if(used[i])continue;
	 s=i;
	 break;
    }
    vector<int> d(n,-1);
    queue<P> que;
    que.push(P(s,0));
    while(que.size()){
	 int v=que.front().fi;
	 int cost=que.front().se;
	 que.pop();
	 if(d[v]!=-1)continue;
	 d[v]=cost;
	 for(int i=0;i<g[v].size();i++){
	   que.push(P(g[v][i].to,cost+g[v][i].cost));
	 }
    }
    int ma=0;
    for(int i=0;i<n;i++){
	 if(ma<d[i]){
	   ma=d[i];
	   s=i;
	 }
    }
    d=vector<int>(n,-1);
    que=queue<P>();
    que.push(P(s,0));
    while(que.size()){
	 int v=que.front().fi;
	 int cost=que.front().se;
	 que.pop();
	 if(d[v]!=-1)continue;
	 d[v]=cost;
	 for(int i=0;i<g[v].size();i++){
	   que.push(P(g[v][i].to,cost+g[v][i].cost));
	 }
    }
    ma=0;
    for(int i=0;i<n;i++)ma=max(ma,d[i]);
    //dbg(sum);  dbg(dsum);  dbg(ma);
    cout<<2*(sum-dsum)-ma+sum<<endl;
  }
  return 0;
}

