#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int a[110][110], dp[110];
int country[110][110];
int culture[110];
bool f[110];
int n, m, k, s, t;
inline int read(){
int f = 1, x = 0;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-')
f = -f;
c = getchar();
}
while (c >= '0' && c <= '9')
x = x * 10 + c - '0', c = getchar();
return f * x;
}
inline void write(int x){
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
write(x / 10);
putchar(x % 10 + 48);
}
void dijkstra(){
for(int i = 1; i <= n; i++){
int mi = -1;
for(int j = 1; j <= n; j++){
if((mi == -1 || dp[j] < dp[mi]) && !f[j]){
mi = j;
}
}
f[mi] = 1;
for(int j = 1; j <= n; j++){
if(!f[j] && dp[mi] + a[mi][j] < dp[j] && a[mi][j] != 0){
dp[j] = dp[mi] + a[mi][j];
}
}
}
}
int main(){
n = read();
k = read();
m = read();
s = read();
t = read();
for (int i = 1; i <= n; i++){
culture[i] = read();
}
int x;
for (int i = 1; i <= k; i++){
for (int j = 1; j <= k; j++){
x = read();
if (x == 1){
country[j][i] = 1;
}
}
}
int u, v, l;
for (int i = 1; i <= m; i++)
{
cin >> u >> v >> l;
if(country[culture[u]][culture[v]] == 0 && culture[u] != culture[v]){
a[v][u] = l;
a[u][v] = l;
}
}
if (country[culture[s]][culture[t]] || culture[s] == culture[t] ){
cout << -1;
return 0;
}
memset(dp, 0x3f, sizeof(dp));
dp[s] = 0;
dijkstra();
if(dp[t] != INF){
write(dp[t]);
}
return 0;
}