#include<stdio.h>#include<string.h>#include<queue>#include<deque>using namespace std;const int maxn = 100500;const int inf = 0x3f3f3f3f;int t , n , m , c , vis[maxn * 4] , cnt[maxn * 4] , dist[maxn * 4] , cc , a , b;struct G{ int head[maxn * 4] , e; struct T{ int u , v , next , cost; }edge[maxn * 10]; void init(){ memset(head , -1 , sizeof(head)); e = 0; }; void addedge(int u , int v , int c){ edge[e].u = u , edge[e].v = v , edge[e].cost = c , edge[e].next = head[u] , head[u] = e ++; };}g;int relax(int u , int v , int c){ if(dist[u] + c < dist[v]){ dist[v] = dist[u] + c; return 1; } return 0;}int SPFA(int src , int des){ memset(vis , 0 , sizeof(vis)); memset(cnt , 0 , sizeof(cnt)); memset(dist , inf , sizeof(dist)); dist[src] = 0 , vis[src] = 1 , ++ cnt[src]; deque<int> q; q.push_back(src); while(!q.empty()){ int u = q.front(); int v; q.pop_front(); vis[u] = 0; for(int i = g.head[u] ; i != -1 ; i = g.edge[i].next){ v = g.edge[i].v; //printf("i = %d u = %d v = %d\n" , i , u , v); if(relax(u , v , g.edge[i].cost) && !vis[v]){ if(!vis[v]){ vis[v] = 1; if(!q.empty()){ if(dist[v] > dist[q.front()]){ q.push_back(v); } else{ q.push_front(v); } } else q.push_back(v); } } } vis[u] = 0; } if(dist[des] == inf) return -2; return dist[des];}int main(){ int a; scanf("%d" , &t); for(int cases = 1 ; cases <= t ; cases ++){ g.init(); scanf("%d%d%d" , &n , &m , &c); for(int i = 1 ; i <= n ; i ++){ scanf("%d" , &a); g.addedge(i , n + 2 * a , 0); g.addedge(n + 2 * a - 1 , i , 0); } for(int i = 1 ; i < n ; i ++){ g.addedge(n + 2 * i , n + 2 * (i + 1) - 1 , c); g.addedge(n + 2 * (i + 1) , n + 2 * i - 1 , c); } for(int i = 0 ; i < m ; i ++){ scanf("%d %d %d", &a , &b , &cc); g.addedge(a , b , cc); g.addedge(b , a , cc); } int temp = SPFA(1 , n); printf("Case #%d: " , cases); if(temp < 0 || temp == inf) printf("-1\n"); else printf("%d\n" , temp); }}