#include <iostream>
#include <string>
#include <vector>
#include<queue>
using namespace std;
const int INF = 1e6;
const int MAXN = 1e3;
struct Edge
{
int from, to, weight;
Edge(int a, int b, int c)
{
from = a, to = b, weight = c;
}
};
struct Node
{
int index, dis;
Node(int a, int b)
{
index = a, dis = b;
}
friend bool operator<(Node a, Node b)
{
return a.dis > b.dis;
}
};
vector<Edge>Adj[MAXN];
int learder[MAXN];
int dist[MAXN];
bool visited[MAXN];
void initConfig()
{
fill(learder, learder + MAXN, -1);
fill(dist, dist + MAXN, INF);
fill(visited, visited + MAXN, false);
for (int i = 0; i < MAXN; i++)
{
Adj[i].clear();
}
}
void Dijstra(int S, int T)
{
priority_queue<Node>q;
dist[S] = 0;
q.push(Node(S, dist[S]));
while (q.empty() == false)
{
Node node = q.top(); q.pop();
if (visited[node.index] !=false ) continue;
visited[node.index] = true;
for (int i = 0; i < Adj[node.index].size(); i++)
{
Edge e = Adj[node.index][i];
if (visited[e.to] != false) continue;
if (dist[e.to] > dist[e.from] + e.weight)
{
dist[e.to] = dist[e.from] + e.weight;
q.push(Node(e.to, dist[e.to]));
}
}
}
}
int main()
{
int N, M;
while (scanf("%d", &N)!=EOF)
{
if (N == 0)
{
break;
}
scanf("%d", &M);
initConfig();
for (int i = 0; i < M; i++)
{
int from, to, weight;
scanf("%d %d %d", &from, &to, &weight);
Adj[from].push_back(Edge(from, to, weight));
Adj[to].push_back(Edge(to, from, weight));
}
for (int i = 1; i <= N; i++)
{
scanf("%d", &learder[i]);
}
for (int i = 0; i < MAXN; i++)
{
for (int j = 0; j < Adj[i].size();)
{
int from = Adj[i][j].from;
int to = Adj[i][j].to;
if (learder[from] == 2 && learder[to] == 1)
{
Adj[i].erase(Adj[i].begin() + j);
}
else
{
j++;
}
}
}
Dijstra(1, 2);
if (dist[2] != INF)
{
cout << dist[2] << endl;
}
else
{
cout << -1 << endl;
}
}
}