玄二关
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7 + 10;
const int inf = 1e9 + 10;
ll n, m, cnt, head[N], dis[N], s[N], c, start, ed, vis[N];
int h[8] = {0, 2, 6, 4, 8, 10, 14};
struct Edge{
ll u, v, w, next;
}edge[N * 2];
void add(ll u, ll v, ll w){
cnt++;
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
struct node{
ll v, w;
bool operator<(const node &x)const{return w > x.w;}
};
priority_queue<node> q;
void dijkstra(int s){
for(int i = 1; i <= 110; i++) dis[i] = inf;
dis[s] = 0;
q.push((node){s,0});
while(!q.empty()){
node k = q.top();
q.pop();
int u = k.v;
if(vis[u] == 1) continue;
vis[u] = 1;
for(int i = head[u]; i; i = edge[i].next){
int v = edge[i].v, w = edge[i].w;
if(dis[u] + w < dis[v] && vis[v] != 1){
dis[v] = dis[u] + w;
q.push((node){v, dis[v]});
}
}
}
}
int main(){
for(int i = 1; i <= 7; i++){
cin >> s[i];
}
cin >> start >> ed >> c;
for(int i = 1; i <= c; i++){
int u, v, w;
cin >> u >> v >> w;
int ww = h[w];
if(s[w] == 1) ww /= 2;
add(u, v, ww);
add(v, u, ww);
}
dijkstra(start);
cout << dis[ed];
return 0;
}