#include <stdio.h>
#include <limits.h>

int n;  /* 島の数 */
int bridge[800][800];  /* 橋の行き先 */
int distance[800][800];  /* 橋の長さ */
int num[800];  /* 各島に掛かる橋の数 */

int base, b;

/* 初期化する */
void init(){
	int i;
	for (i = 0; i < n; i++){
		num[i] = 0;
	}
}

/* 指定された二つの島の間に橋を作る。 */
void construct(int i, int j, int d){
	bridge[i][num[i]] = j;
	distance[i][num[i]] = d;
	num[i]++;
	bridge[j][num[j]] = i;
	distance[j][num[j]] = d;
	num[j]++;
}

/*
	指定された島から探索を始める。
	島と橋は木構造であることが分かっているので、深さ優先探索によって遠くの橋から順に解体してゆく。
*/
int tryr(int current, int last){
	int time = 0;
	int i;

	/* 隣の島に移動する場合 */
	for (i = 0; i < num[current]; i++){
		if (bridge[current][i] == last) continue;

		if (num[bridge[current][i]] == 1){
			/* 端の島に繋がる橋なので、渡ることなく解体する */
			time += distance[current][i];
			if (b > base) base = b;
		}else{
			/* 渡った先にも橋があるので、渡って全て解体した後この橋も解体する */
			b += distance[current][i];
			time += distance[current][i] * 3 + tryr(bridge[current][i], current);
			b -= distance[current][i];
		}
	}

	return time;
}

/*
	全ての橋を撤去するのに必要な最短の単位時間数を返す。
	各島を始点とした場合についてそれぞれ int tryr(int current, int last) で試行するが、
	探索の始点と終点は同じ島でなくてよいので、その取りうる最長距離を base として求め、差し引く。
*/
int try(){
	int min = INT_MAX;
	int t, i;
	for (i = 0; i < n; i++){
		base = 0;
		b = 0;
		t = tryr(i, i);
		t -= base;
		if (t < min) min = t;
	}
	return min;
}

int main(void){
	int p[800], d[800];
	int i;

	while (scanf("%d", &n) == 1){
		if (n < 3 || n > 800) break;

		/* 初期化する */
		init();

		/* 橋を入力する */
		for (i = 2; i <= n; i++) scanf("%d", &p[i-1]);
		for (i = 2; i <= n; i++) scanf("%d", &d[i-1]);
		for (i = 2; i <= n; i++) construct(i - 1, p[i-1] - 1, d[i-1]);

		/* 試行し結果を出力する */
		printf("%d\n", try());
	}

    return 0;
}