#include<bits/stdc++.h>
using namespace std;
const int MAXN=102,MAXM=10002,INF=0x3f3f3f3f;
inline int gi(){
int x=0,o=1;
char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')ch=getchar(),o=-1;
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
struct edge{
int to,w,next;
}e[MAXM];
int tot=0,head[MAXN];
void add(int u,int v,int w){
e[++tot].to=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot;
e[++tot].to=u;e[tot].w=w;e[tot].next=head[v];head[v]=tot;
}
int n,k,m,s,t,u,v,d,c[MAXN],dis[MAXN];
bool b[MAXN][MAXN],vis[MAXN];
bool check(int u){
if(vis[c[u]])return 0;
for(int i=1;i<=k;i++){
if(vis[i]&&b[c[u]][i])return 0;
}
return 1;
}
void DFS(int u){
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(check(v)&&dis[u]+e[i].w<dis[v]){
dis[v]=dis[u]+e[i].w;
DFS(v);
}
}
}
int main(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
n=gi(),k=gi(),m=gi(),s=gi(),t=gi();
for(int i=1;i<=n;i++)c[i]=gi();
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
b[i][j]=gi();
for(int i=1;i<=m;i++){
u=gi(),v=gi(),d=gi();
add(u,v,d);
}
dis[s]=0;vis[c[s]]=1;
DFS(s);
if(dis[t]>=INF)cout<<-1;
else cout<<dis[t];
return 0;
}
RT 他不改vis数组就AC了>_<
或许是因为NOIP所以数据特别水?