#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
template <typename T>
inline T read()
{
T ans=0,f=1;char c;
while((c=getchar())<'0'||c>'9') if(c=='-') f=-1;
do {ans=ans*10+c-'0';} while((c=getchar())>='0'&&c<='9');
return ans*f;
}
#define maxn 105
#define maxm 10005
#define inf 0x3f3f3f3f
int n,k,m,s,t,c[maxn],cnt,head[maxn],ans=inf;
bool learned[maxn],flag=0;
bool a[maxn][maxn];
struct Edge
{
int to,next,w;
} edge[maxm<<1];
inline void add(int u,int v,int w)
{
edge[++cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline bool ableto(int u)
{
if(learned[c[u]])
return 0;
for(int i=1;i<=k;++i)
if(a[u][i] && learned[i])
return 0;
return 1;
}
inline void dfs(int u,int sum)
{
if(sum>ans)
return;
if(u==t)
{
ans=min(ans,sum);
flag=1;
return;
}
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(ableto(v))
{
learned[c[v]]=1;
dfs(v,sum+edge[i].w);
learned[c[v]]=0;
}
}
}
signed main()
{
n=read<int>(),k=read<int>(),m=read<int>(),s=read<int>(),t=read<int>();
for(int i=1;i<=n;++i)
c[i]=read<int>();
if(c[s]==c[t])
{
cout << -1 << endl;
return 0;
}
for(int i=1;i<=k;++i)
for(int j=1;j<=k;++j)
a[i][j]=read<int>();
for(int i=1;i<=m;++i)
{
int u=read<int>(),v=read<int>(),w=read<int>();
add(u,v,w),add(v,u,w);
}
learned[c[s]]=1;
dfs(s,0);
if(flag)
cout << ans << endl;
else
cout << -1 << endl;
return 0;
}
WA on #10,应输出 -1,但是寄。
qwq