1 #include<cstdio>
2 int n,k,m,s,t,ans=-1;
3 int a,b,c;
4 int v[110];
5 bool u[110],map[110][110];
6 int h[110],hs=1;
7 struct edge{int s,n,d;}e[20010];
8 void dfs(int n,int s){
9 if(n==t){if(s<ans||ans==-1) ans=s;return;}
10 if(s>ans&&ans!=-1) return;
11 for(int i=h[n];i;i=e[i].n)
12 if(!u[v[e[i].s]]){
13 for(int j=1;j<=k;j++) if(map[v[e[i].s]][j]&&u[j]) a=-1;
14 if(a<0) continue;
15 u[v[e[i].s]]=1;
16 dfs(e[i].s,s+e[i].d);
17 u[v[e[i].s]]=0;
18 }
19 }
20 int main(){
21 scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
22 for(int i=1;i<=n;i++) scanf("%d",&v[i]);
23 for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) scanf("%d",&map[i][j]);
24 for(int i=1;i<=m;i++){
25 scanf("%d%d%d",&a,&b,&c);
26 e[++hs]=(edge){b,h[a],c},h[a]=hs;
27 e[++hs]=(edge){a,h[b],c},h[b]=hs;
28 }
29 u[v[s]]=1;
30 dfs(s,0);
31 printf("%d",ans);
32 return 0;
33 }