#include<bits/stdc++.h>
using namespace std;
#define debug(n,m) cout<<"["<<#n<<"]->"<<n<<m
#define int long long
#define all(x,off) x.begin()+off,x.end()
#define pb push_back
const int N=1e6+10;
const int inf=9e17;
const int mod=1e9+7;
vector<int> g[1001];
vector<int>tr[1001];
vector<array<int,3>> ed;
int cur[1001][1001];
int p[1001];
int n,m,k;
int l[11];
int r[11];
int dfs(int u,int par) {
int tot=0;
for (int v : tr[u]) {
if (v==par) continue;
cur[u][v]=cur[v][u]=dfs(v,u);
tot+=cur[u][v];
}
return tot+p[u];
}
struct DSU {
vector<int> p,sz;
void init(int n) {
p.assign(n+1,0);
sz.assign(n+1,0);
for (int i=1;i<=n;++i) p[i]=i,sz[i]=1;
}
int lead(int v) {
return (p[v]==v)?v:p[v]=lead(p[v]);
}
void unite(int a,int b) {
a=lead(a);
b=lead(b);
if (a==b) return;
if (sz[a]>sz[b]) swap(a,b);
sz[b]+=sz[a];
sz[a]=0;
p[a]=b;
}
bool same(int a,int b) {
return lead(a)==lead(b);
}
};
int solve_sub3() {
DSU ds;
ds.init(n);
int tot=0;
for (auto &[w,u,v]:ed) {
if (ds.same(u,v))continue;
tot+=w;
ds.unite(u,v);
}
ds.init(n);
int res=0;
for (int mask=1;mask<(1<<k);++mask) {
for (int i=1;i<=n;++i) tr[i].clear();
bool cn=true;
for (int j=0;j<k;++j) {
if (mask&(1<<j)) {
if (ds.same(l[j+1],r[j+1])) {
cn=false;
break;
}
ds.unite(l[j+1],r[j+1]);
tr[l[j+1]].pb(r[j+1]);
tr[r[j+1]].pb(l[j+1]);
}
}
if (!cn) continue;
for (auto &[w,u,v]:ed) {
if (!ds.same(u,v)) {
tot-=w;
tr[u].pb(v);
tr[v].pb(u);
ds.unite(u,v);
}
}
if (tot<=0) continue;
dfs(1,0);
int cur=0;
for (int j=0;j<k;++j) {
if (mask&(1<<j)) cur=max(cur,::cur[l[j+1]][r[j+1]]);
}
res=max(res,cur*tot);
}
return res;
}
void levi() {
cin>>n>>m>>k;
for (int i=1;i<=m;++i) {
int u,v,w;
cin>>u>>v>>w;
g[u].pb(v);
g[v].pb(u);
ed.pb({w,u,v});
}
for (int i=1;i<=k;++i) cin>>l[i]>>r[i];
for (int i=1;i<=n;++i) cin>>p[i];
// g[l].pb(r);
// g[r].pb(l);
sort(begin(ed),end(ed));
int res=solve_sub3();
// for (int i=1;i<=(int)1e6;++i) {
// for (int i=1;i<=n;++i) tr[i].clear();
// }
cout<<res<<'\n';
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);int tt=1;//cin>>tt;
while (tt--) levi();
}
/*
*/