#include <bits/stdc++.h>
using namespace std;
struct Edge {
int u, v;
long long w;
bool neu;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N, M, K;
cin >> N >> M >> K;
vector<Edge> oldEdges;
vector<long long> cand;
for (int i = 0; i < M; i++) {
int a, b;
long long c;
cin >> a >> b >> c;
oldEdges.push_back({a, b, c, false});
cand.push_back(c);
}
int x, y;
cin >> x >> y;
vector<long long> p(N + 1);
for (int i = 1; i <= N; i++) cin >> p[i];
long long ans = 0;
int E = M + 1;
for (long long wnew : cand) {
vector<Edge> edges = oldEdges;
edges.push_back({x, y, wnew, true});
long long bestCost = (1LL << 62);
long long brr = 0;
for (int mask = 0; mask < (1 << E); mask++) {
if (__builtin_popcount(mask) != N - 1) continue;
vector<vector<pair<int,int>>> g(N + 1);
long long cost = 0;
int newId = -1;
int cntNew = 0;
for (int i = 0; i < E; i++) {
if (mask >> i & 1) {
cost += edges[i].w;
g[edges[i].u].push_back({edges[i].v, i});
g[edges[i].v].push_back({edges[i].u, i});
if (edges[i].neu) {
newId = i;
cntNew++;
}
}
}
if (cntNew > 1) continue;
vector<int> vis(N + 1, 0);
queue<int> q;
q.push(1);
vis[1] = 1;
int reached = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
reached++;
for (auto [v, id] : g[u]) {
if (!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
if (reached != N) continue;
long long revenue = 0;
if (newId != -1) {
vector<int> vis2(N + 1, 0);
queue<int> q2;
q2.push(1);
vis2[1] = 1;
while (!q2.empty()) {
int u = q2.front();
q2.pop();
for (auto [v, id] : g[u]) {
if (id == newId) continue;
if (!vis2[v]) {
vis2[v] = 1;
q2.push(v);
}
}
}
long long flow = 0;
for (int i = 1; i <= N; i++) {
if (!vis2[i]) flow += p[i];
}
revenue = flow * wnew;
}
if (cost < bestCost) {
bestCost = cost;
brr = revenue;
} else if (cost == bestCost) {
brr = max(brr, revenue);
}
}
ans = max(ans, brr);
}
cout << ans << '\n';
return 0;
}