#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
const int INF = 1e9;
const int N = 105;
int n , m , p;
vector<pair<int , int>> adj[N];
int imp_node[12];
int raw_channel[12];
int imp_channel[12];
map<int , int> mp;
void inp(){
cin >> n >> m >> p;
for (int i = 1 ; i <= m ; ++i){
int u , v , w;
cin >> u >> v >> w;
adj[u].push_back({v , w});
adj[v].push_back({u , w});
}
for (int i = 0 ; i < p ; ++i){
cin >> raw_channel[i] >> imp_node[i];
}
}
void solve(){
int k = 0;
for (int i = 0 ; i < p ; ++i){
if (!mp.count(raw_channel[i])) mp[raw_channel[i]] = k++;
}
for (int i = 0 ; i < p ; ++i){
imp_channel[i] = mp[raw_channel[i]];
}
vector<int> channel_mask(1 << k , 0);
for (int i = 0 ; i < p ; ++i){
channel_mask[imp_channel[i]] |= (1 << i);
}
int total_mask = 1 << p;
vector<vector<int>> dp(total_mask , vector<int>(n + 1 , INF));
for (int i = 0 ; i < p ; ++i){
dp[1 << i][imp_node[i]] = 0;
}
for (int mask = 1 ; mask < total_mask ; ++mask){
for (int sub = (mask - 1) & mask ; sub ; sub = (sub - 1) & mask){
int other = mask ^ sub;
for (int i = 1 ; i <= n ; ++i){
if (dp[sub][i] == INF || dp[other][i] == INF) continue;
dp[mask][i] = min(dp[mask][i] , dp[sub][i] + dp[other][i]);
}
}
priority_queue<pair<int , int> , vector<pair<int , int>> , greater<pair<int , int>>> pq;
for (int i = 1 ; i <= n ; ++i){
if (dp[mask][i] != INF){
pq.push({dp[mask][i] , i});
}
}
while (!pq.empty()){
auto x = pq.top();
pq.pop();
int du = x.fi;
int u = x.se;
if (du != dp[mask][u]) continue;
for (auto it : adj[u]){
int v = it.fi;
int w = it.se;
if (dp[mask][v] > du + w){
dp[mask][v] = du + w;
pq.push({dp[mask][v] , v});
}
}
}
}
vector<int> imp_mask(1 << k , 0);
for (int mask = 1 ; mask < (1 << k) ; ++mask){
int low = mask & (-mask);
int id = __builtin_ctz(low);
imp_mask[mask] = imp_mask[mask ^ low] | channel_mask[id];
}
vector<int> f(1 << k , INF);
for (int mask = 1 ; mask < (1 << k) ; ++mask){
int cur = imp_mask[mask];
for (int i = 1 ; i <= n ; ++i){
f[mask] = min(f[mask] , dp[cur][i]);
}
}
vector<int> g(1 << k , INF);
g[0] = 0;
for (int mask = 1 ; mask < (1 << k) ; ++mask){
for (int sub = mask ; sub ; sub = (sub - 1) & mask){
int other = mask ^ sub;
if (g[other] == INF || f[sub] == INF) continue;
g[mask] = min(g[mask] , g[other] + f[sub]);
}
}
cout << g[(1 << k) - 1];
}
int main(){
faster;
inp();
solve();
return 0;
}