#include<bits/stdc++.h>
using namespace std;
namespace IN{
inline int read()
{
int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+c-48;
return x*f;
}
}
#define MAXN 105
#define MAXM 10005
#define R register
namespace Graph{
struct edge{
int to,next,dis;
} e[MAXM<<1];
int head[MAXN],cnt;
inline void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].next=head[u];
e[cnt].dis=w;
head[u]=cnt;
}
struct node{
int pos,dis;
bool operator<(node x) const{ return x.dis<dis;}
};
priority_queue<node> q;
int dis[MAXN];
bool vis[MAXN];
inline void Dijkstra(int s)
{
q.push(node{s,0});
dis[s]=0;
memset(dis,-1,sizeof(dis));
memset(vis,0,sizeof(vis));
while(!q.empty())
{
int u=q.top().pos;
if(vis[u]) continue;
vis[u]=1;
for(R int i=head[u];i;i=e[i].next)
{
int v=e[i].to,w=e[i].dis;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])
q.push(node{v,dis[v]});
}
}
}
}
}
namespace Solve{
int n,m,k,s,t;
int cult[MAXN];
int a[MAXN][MAXN];
inline void init()
{
using IN::read;
n=read();k=read();m=read();s=read();t=read();
for(R int i=1;i<=n;i++) cult[i]=read();
for(R int i=1;i<=k;i++)
for(R int j=1;j<=k;j++)
a[i][j]=read();
for(R int i=1;i<=m;i++)
{
int u=read(),v=read(),d=read();
if(!a[cult[v]][cult[u]]&&cult[u]!=cult[v]) Graph::add(u,v,d);
if(!a[cult[u]][cult[v]]&&cult[u]!=cult[v]) Graph::add(v,u,d);
}
}
inline int go()
{
init();
if(cult[s]==cult[t]) puts("-1");
else{
Graph::Dijkstra(s);
printf("%d\n",Graph::dis[t]);
}
return 0;
}
}
int main()
{
return Solve::go();
}