#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;
}