#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
typedef long long int ll;
long long GCD(long long a, long long b) {return b?GCD(b,a%b):a;}
long long LCM(long long a, long long b) {return a/GCD(a,b)*b;}
#define mmax(x,y)(x>y?x:y)
#define mmin(x,y)(x<y?x:y)
#define chmax(x,y) x=mmax(x,y)
#define chmin(x,y) x=mmin(x,y)
#define INF 100000000
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};

int cnt[810],p[810],d[810];
int n;
int a[810][810];
void warshall_floyd(){
	int i,j,k;
    for (k = 0; k < n; k++){       // 経由する頂点
	    for (i = 0; i < n; i++) {    // 始点
	        if(a[i][k]==INF)continue;
	        for (j = 0; j < n; j++) {  // 終点
	        if(a[k][j]==INF)continue;
	        chmin(a[i][j], a[i][k] + a[k][j]);
	        }
	    }
    }
}


int main(void)
{
	scanf("%d",&n);
	while(n>0){
		int i,j;
		int ans=0;
		for(i=0;i<n-1;i++)scanf("%d",&p[i+1]);
		for(i=0;i<n-1;i++)scanf("%d",&d[i+1]);
		memset(cnt,0,sizeof(cnt));
		for(i=0;i<n-1;i++){
			cnt[i+1]++;
			cnt[p[i+1]-1]++;
			ans+=2*d[i+1];
		}
		int m = ans/2;
		for(i=0;i<n;i++){
			//printf("%d\n",cnt[i]);
			if(cnt[i]==1){
				if(i>0){
					ans-=d[i];
					m-=d[i];
				}
				else if(i==0){
					for(j=0;j<n-1;j++){
						if(p[j+1]-1==0){
							ans-=d[j+1];
							m-=d[j+1];
							break;
						}
					}
				}
			}
		}
		ans+=m;
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				a[i][j]=INF;
			}
		}
		for(i=0;i<n-1;i++){
			if(cnt[i+1]!=1&&cnt[p[i+1]-1]!=1){
				a[i+1][p[i+1]-1]=d[i+1];
				a[p[i+1]-1][i+1]=d[i+1];
			}
		}
		warshall_floyd();
		int tmp=0;
		for(i=0;i<n-1;i++){
			for(j=i+1;j<n;j++){
				//printf("%d %d %d\n",i,j,a[i][j]);
				if(a[i][j]!=INF){
					chmax(tmp,a[i][j]);
				}
			}
		}
		//printf("%d\n",tmp);
		printf("%d\n",ans-tmp);
		scanf("%d",&n);
	}
    return 0;
}
