#include <stdio.h>
#include <stdlib.h>

#define MAXN 800

//??????????????¶
//??¨????????????
//http://www.cse.kyoto-su.ac.jp/~hiraishi/ICPC/ICPC2014/Domestic/ICPC2014_DomE/ICPC2014_DomE.pdf

//??¶????§???????
typedef struct {
    int ne; //???????????£?????????????????° num_edge
    int eids[MAXN]; //???????????£????????????????????\?????? edge_ids
    int rm; //1?????¨???????????????????????????
} Node;

//???????§???????
typedef struct {
    int nid1, nid2; //???????????£???????????¶????????\???????????? node_id
    int len; //????????????
    int rm; //1?????¨???????????????????????????
} Edge;

//??????????????????????????¶??¨???????????\???????????????
Node *nodes; 
Edge *edges;
int N = 0, C1, C2, C3;

//nid????????¶???????????????????????? node_id
Node* nd(int nid)
{
    return &nodes[nid - 1];
}

//eid????????????????????????????????? edge_id
Edge* ed(int eid)
{
    return &edges[eid - 1];
}

//???????????°??¨
void DebugPrint()
{
    int i, j;
    for(i = 1; i <= N; i++)
    {
        printf("\n%d????????¶\n????????£?????????????????°: %d\n", i, nd(i)->ne);
        printf("????????£??????????????????: ");
        for(j = 0; j < nd(i)->ne; j++)
        {
            printf("%d,",nd(i)->eids[j]);
        }
        printf("\nRemoved: %s\n\n", (nd(i)->rm ? "true" : "false"));
    }
    for(i = 1; i <= N - 1; i++)
    {
        printf("%d?????????\n????????£???????????¶??????: %d,%d\n", i, ed(i)->nid1, ed(i)->nid2);
        printf("????????????: %d\n", ed(i)->len);
        printf("Removed: %s\n\n", (ed(i)->rm ? "true" : "false"));
    }

    printf("C1: %d\nC2: %d\nC3: %d\n", C1, C2, C3);
}

//pnid: ??´????????¶???nid pre_nid, cnid: ?????¨?????¶???nid current_nid, d: ????????§????????¢???????¨?
int Search(int pnid, int cnid, int d)
{
    int i, eid, x, maxd = d; //?????§?????¢???????????????????????§????????¢???????¨?

    for(i = 0; i < nd(cnid)->ne; i++)
    {
        eid = nd(cnid)->eids[i];
        if(ed(eid)->rm) continue; //???????????????????????????
        if(ed(eid)->nid1 == pnid || ed(eid)->nid2 == pnid) continue; //??´????????¶??????????????????
        x = (ed(eid)->nid1 != cnid ? Search(cnid, ed(eid)->nid1, d + ed(eid)->len) : Search(cnid, ed(eid)->nid2, d + ed(eid)->len)); //???????????????????????°?????\??????
        if(x > maxd) maxd = x; //?????????????????§????????§?????¢???????????§????????¨???
    }

    return maxd; //?????§?????¢?????????
}

//???????????¨??¢??°
void Init()
{
    int i;

    C1 = 0;
    C2 = 0;
    C3 = 0;
    //free???????????¨????????????????????§??????????????????
    // free(nodes);
    // free(edges);
    nodes = (Node*)malloc(sizeof(Node) * MAXN);
    edges = (Edge*)malloc(sizeof(Edge) * (MAXN - 1));
}

int main()
{
    int i, x;
    int p; //??\????????¶??????
    int d; //??\??????????????????

    while(1)
    {
        //??¶?????°?????\???
        scanf("%d", &N); 

        //0?????\??????????????¨???????????????????????????
        if(N == 0) break;

        //???????????????
        Init();

        //i????????¶????????????
        //i-1?????????????????????
        for(i = 2; i <= N; i++)
        {
            //i????????¶??????????????£???????????¶???????????????
            scanf("%d", &p); 
            //i-1???????????????????????£???????????¶???????????????
            ed(i - 1)->nid1 = p;
            ed(i - 1)->nid2 = i;
            //i???,p????????¶??????????????£???????????????????????????????????????????????£?????????????????°????¢???????
            nd(p)->eids[nd(p)->ne++] = i - 1;
            nd(i)->eids[nd(i)->ne++] = i - 1;     
        }

        //i?????????????????????
        for(i = 1; i <= N - 1; i++)
        {
            //i???????????????????????????
            scanf("%d", &(ed(i)->len));
        }

        //i????????¶????????????
        for(i = 1; i <= N; i++)
        {
            //??????????????£?????????????????°??????????????¨???
            if(nd(i)->ne == 1)
            {
                //??¶???????????????
                nd(i)->rm = 1;
                //??????????????????
                ed(nd(i)->eids[0])->rm = 1;
                //??????????????????????????????C1?????????????????????
                C1 += ed(nd(i)->eids[0])->len;
            }
        }
        //i?????????????????????
        for(i = 1; i < N - 1; i++)
        {
            //??????????????????????????????????????????
            if(ed(i)->rm) continue;

            //??????????????????????????????????????????C2?????????????????????
            C2 += ed(i)->len;
        }

        //i???????????¶???????????????????????§???????????¶?????§????????¢????????????C3?????£??\
        for(i = 1; i <= N; i++)
        {
            if(nd(i)->rm) continue; //?????????????????¶?????????
            x = Search(-1, i, 0);
            if(x > C3) C3 = x;
        }

        //DebugPrint();

        //(????????????????????§???????????????????????????)+(???????????£????????£?????????????????????????????????????????????)-(????????????????????????????????????)
        printf("%d\n", C1 + 3 * C2 - C3); 
    }

    return 0;
}