rt,#10 超时了
#include <bits/stdc++.h>
using namespace std;
const int N = 233;
int s, t, cnt = 0x3f3f3f3f;
struct Node{
int id, data;
};
vector<Node> edge[N];
int c[N], tra[N], sum;
bool pc[N][N], vis[N], late[N], flag;
bool check(int v)
{
for (int i = 1; i <= sum; i++)if (pc[v][tra[i]])return 0;
return 1;
}
void dfs(int u, int ans)
{
if (ans >= cnt)return;
if (u == t)
{
cnt = ans;
return;
}
vis[u] = 1;
tra[++sum] = c[u];
late[c[u]] = 1;
for (int i = 0; i < edge[u].size(); i++)
{
int v = edge[u][i].id, w = edge[u][i].data;
if (!vis[v] && !late[c[v]] && check(c[v]))
dfs(v, ans + w);
}
vis[u] = 0;
tra[++sum] = -1;
late[c[u]] = 0;
}
int read()
{
int ans = 0, w = 1; char s = getchar();
for (; s < '0' || s > '9'; s = getchar())if (s == '-')w = -w;
for (; s >= '0' && s <= '9'; s = getchar())ans = (ans << 3) + (ans << 1) + s - '0';
return ans * w;
}
int main()
{
int n, k, m, i, j, u, v, w;
n = read(); k = read(); m = read(); s = read(); t = read();
for (i = 1; i <= n; i++)c[i] = read();
for (i = 1; i <= k; i++)
for (j = 1; j <= k; j++)
pc[i][j] = read();
for (i = 1; i <= m; i++)
{
u = read(); v = read(); w = read();
Node now;
now.id = v; now.data = w;
if (!pc[c[v]][c[u]])edge[u].push_back(now);
now.id = u; now.data = w;
if (!pc[c[u]][c[v]])edge[v].push_back(now);
}
dfs(s, 0);
if (cnt == 0x3f3f3f3f)cnt = -1;
cout << cnt;
// getchar(); getchar();
return 0;
}