#include <queue>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=1000;
const int MAX=10000;
struct edge{
int to;
int length;
edge(int a,int b):to(a),length(b){};
};
struct city{
int number;
int dis;
int leader;
city(int number,int dis,int leader):number(number),dis(dis),leader(leader){};
bool operator<(city y) const{
return dis>y.dis;
}
};
vector<edge> G[maxn];
priority_queue<city> q;
int dist[maxn];
int lead[maxn];
void init(){
for(int i=0;i<maxn;i++){
G[i].clear();
lead[i]=0;
dist[i]=MAX;
}
while(!q.empty()) q.pop();
}
bool IfCanPass(int x,int y){
if(lead[x]==lead[y]) return true;
else if(lead[x]==1 && lead[y]==2) return true;
else return false;
}
int main(){
int n;
while(cin>>n && n!=0){
init();
int m;
cin>>m;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
G[a].push_back(edge(b,c));
G[b].push_back(edge(a,c));
}
for(int i=1;i<=n;i++){
int ld;
cin>>ld;
lead[i]=ld;
}
q.push(city(1,0,1));
dist[1]=0;
while(!q.empty()){
city tem=q.top();
q.pop();
for(int i=0;i<G[tem.number].size();i++){
edge t=G[tem.number][i];
if(dist[t.to]>dist[tem.number]+t.length &&
IfCanPass(tem.number, t.to)){
dist[t.to]=dist[tem.number]+t.length;
q.push(city(t.to,dist[t.to],lead[t.to]));
}
}
}
if(dist[2]==MAX) cout<<"-1"<<endl;
else cout<<dist[2]<<endl;
}
}