#include<bits/stdc++.h>
using namespace std;
int n,k,m,s,t;
int c[105];
int hate[105][105],mp[105][105],re[105][105];
int cnt=0,head[105];
int dis[105];
int ans=INT_MAX;
struct node{
int from,to,nxt,w;
}e[20005];
set<int>st;
void add_edge(int u,int v,int l){
cnt++;
e[cnt].from=u;
e[cnt].to=v;
e[cnt].nxt=head[u];
e[cnt].w=l;
head[u]=cnt;
re[u][v]=cnt;
}
bool isinq[105];
queue<int>q;
void spfa()
{
memset(dis,0x7f,sizeof(dis));
q.push(s);
isinq[s]=true;
dis[s]=0;
int top;
while(q.size())
{
top=q.front();
q.pop();
isinq[top] = false;
for(int i=head[top];i;i=e[i].nxt){
int v=e[i].to;
if(dis[v]>dis[top]+e[i].w){
dis[v]>dis[top]+e[i].w;
if(!isinq[v]){
isinq[v]=1;
q.push(v);
}
}
}
}
}
void dfs(int u,int len){
if(u==t){
ans=min(ans,len);
return;
}
if(s+dis[u]>ans)return;
int uc=c[u];
st.insert(uc);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
int vc=c[v];
set<int>::iterator it=st.find(vc);
if(!hate[vc][uc] && it==st.end()){
dfs(v,len+e[i].w);
}
}
st.erase(uc);
}
int main(){
cin>>n>>k>>m>>s>>t;
for(int i=1;i<=n;i++){
int cu;
scanf("%d",&cu);
c[i]=cu;
}
for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
scanf("%d",&hate[i][j]);
}
}
memset(mp,0x3f3f3f3f,sizeof(mp));
for(int i=1;i<=m;i++){
int u,v,l;
scanf("%d%d%d",&u,&v,&l);
if(l<mp[u][v] && mp[u][v]!=0x3f3f3f3f){
mp[u][v]=l;
mp[v][u]=l;
e[re[u][v]].w=l;
e[re[v][u]].w=l;
}
else if(mp[u][v]==0x3f3f3f3f){
add_edge(u,v,l);
add_edge(v,u,l);
mp[u][v]=l;
mp[v][u]=l;
}
else if(l>mp[u][v]);
}
if(c[1]==c[n]){
printf("-1\n");
return 0;
}
spfa();
if(dis[t]==INT_MAX){
printf("-1\n");
return 0;
}
dfs(s,0);
if(ans==INT_MAX)printf("-1\n");
else printf("%d\n",ans);
return 0;
}