C language source code: [cpp] # include <stdio. h> # include <limits. h> # define maxsize 610 int E [maxsize] [maxsize]; int T [maxsize] [2]; int ed [10009] [3]; int main () {int n, m, a [maxsize], I, j, fmin, min, sum, p, q; scanf ("% d", & n); while (n) {for (I = 0; I <n; I ++) for (j = 0; j <n; j ++) E [I] [j] = INT_MAX; scanf ("% d", & m); I = 1; while (I <= m) {scanf ("% d ", & ed [I] [0], & ed [I] [1], & ed [I] [2]); I ++ ;}for (I = 0; I <n; I ++) scanf ("% d", & a [I]); I = 1; while (I <= m) {p = ed [I] [0]-1; q = ed [I] [1]-1; if (a [p] = 1 & a [q] = 2) E [p] [q] = ed [I] [2]; else if (a [p] = 2 & a [q] = 1) E [q] [p] = ed [I] [2]; else {E [p] [q] = ed [I] [2]; E [q] [p] = ed [I] [2];} I ++ ;} for (I = 0; I <n; I ++) {T [I] [0] = 0; T [I] [1] = INT_MAX;} I = 0; sum = 0; T [0] [0] = 1; T [0] [1] = 0; while (I! = 1) {for (j = 0; j <n; j ++) {if (T [j] [0] = 0 & E [I] [j]! = INT_MAX & sum + E [I] [j] <T [j] [1]) T [j] [1] = sum + E [I] [j];} fmin =-1; min = INT_MAX; for (j = 0; j <n; j ++) {if (T [j] [0] = 0 & T [j] [1] <min) {fmin = j; min = T [j] [1] ;}} sum = min; if (fmin =-1) break; else I = fmin; T [I] [0] = 1;} if (T [1] [1]! = INT_MAX) printf ("% d \ n", T [1] [1]); else printf ("-1 \ n"); scanf ("% d ", & n );}}