#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000//?§????????????????????????????????±???????
#define MAX 100000//?????§???MAX??¨????????????
typedef struct List{//??¶??¨????????????????????????????´????????§???????
    int count;
    int listps[SIZE];
    int listds[SIZE];
}List;

 int n;//??¶?????°????¨?????????????????????????

 int **dp;//??¶???????§??????????????????\??????????????????????????????0???????????????????????????2???????????§????????????????????\??????1?????????2????????????2???????????§????????????????????\??????
 int *edge;//??¶????????§??????????????§?????????????????\?????????????????????
List *node;//??¶?????????????????\??????



void add(List* node,int* num);
void func(int c, int p);
int min(int n1,int n2);
int main(void){
    int ans[SIZE]={};
    int k=0;
    int i,r;
    int num;//????°??????????????¨????????????????????????°
    while(1){
        
        scanf("%d",&n);//??¶?????°?????\?????????
        if(n == 0)//0??¨??\????????????????¨??????????
            break;
        
        dp = (int**)malloc(sizeof(int*)*2);
        for(i=0;i<2;i++)
            dp[i]=(int*)malloc(sizeof(int)*n);//?????¢????¢????
        
        node =(List*)malloc(sizeof(List)*n);
        for(i=0;i<n;i++)
            node[i].count=0;
        
        edge = (int*)malloc(sizeof(int)*n);//?????¢????¢????
        
        
        
        
        int *ps =(int*)malloc(sizeof(int)*(n-1));//???????????¶?????????????????£????????????????¨?????????????????????????
        int *ds = (int*)malloc(sizeof(int)*(n-1));//???????????????????????????????¨?????????????????????????
        
        for( i = 0; i < n - 1; i++){
            scanf("%d",&ps[i]);//??????????????\???
            ps[i]-=1;
        }
        for( i = 0; i < n - 1; i++)
            scanf("%d",&ds[i]);//??????????????\???
        
        
        for(i = 0; i < n - 1; i++){//node????????????????¨????????????????
            int l[]={ps[i],ds[i]};//??¶??¨??????????????????????????????????????§??????
            add(&node[i+1],l);//????????????????´?
            
            int m[]={i+1,ds[i]};
            add(&node[ps[i]],m);//???????????????????????????????´?????????????
            
        }
        
        num = MAX;//?????????MAX??§???????????????
        for( r = 0; r < n; r++){
            func(r, r);//?????????????¨????
            num = min(num, dp[0][r]);//??????????¨??????????????????¨??????????????§????????????????????????
        }
        ans[k]=num;//???????????????
        k++;
    }
    for(i=0;i<k;i++)
        printf("%d\n",ans[i]);//???????????????
    
    return 0;
}

void func(int s, int p){//s??????p?????§???????°??????????????¨?????????????????????¢??°
        
    dp[1][s] = 0;//???????????????????????§???????????????????????¨??????
    edge[s] = 1;//s????????§????????¨??????
    int i;
    for(i=0;i<node[s].count;i++){
        int to = node[s].listps[i];//to?????¶???,cost?????????????????\??????
        int cost = node[s].listds[i];
        if(to == p)//to??¨p??????????????£?????????????????????
        continue;
        
        func(to, s);//?????????to??????s?????§????????????????¨??????????
       
        dp[1][s] += dp[1][to];//dp[1][s]???dp[1][to]????¶????????????????
        if(edge[to]!=1)//to????????§???????????£??????
        dp[1][s] += 3 * cost; //???????§??????¨??´?£?????????????????¨????
        
        else//?????§?????£??????
        dp[1][s] += cost;//??´?£????????????????????¨????
        
      edge[s] = 0;//s????????§???????????????
    }
    dp[0][s] = dp[1][s];//ds[1][s]?????????????°?????????????????????£?????????
    
    //???????????¶?????????????????????????±???????
    for(i=0;i<node[s].count;i++){
        int to = node[s].listps[i];
        int cost = node[s].listds[i];
        if(to == p || edge[to]==1)//to?????????p??¨????????´??????,???????????????
        continue;
        
        int tmp = dp[1][s]; //???????????????????????§????????????????¨????????????????
        
        tmp -= dp[1][to]; //?????????to??????????????????????????????
        tmp += dp[0][to]; //to????????????????????£???????????¶???????§??????£????????¨?????????
        tmp -= cost; //???????????????????????????????????§???cost??????????????????
        
        dp[0][s] = min(dp[0][s], tmp);//min??¨d[0][s]????°?????????????dp[0][s]??¨??????
    }
}

int min(int n1,int n2){//?°?????????????????????¢??°
    if(n1>n2)
        return n2;
    else
        return n1;
}

void add(List* node,int* num){//?§??????????????????????????´??????????????????¢??°
    
    
    node->listps[node->count]=num[0];
    node->listds[node->count]=num[1];
    node->count+=1;
}