#include <bits/stdc++.h>
using namespace std;
int n, m, k;
const int N = 1010;
vector<int> e[N], val[N];
int s[N][N], rou[N][2], ee[N][2];
bool u[N];
struct Dis {
  int pos;
  int val;
};
bool operator<(Dis x, Dis y) { return x.val > y.val; }
void dijkstra(int st) {
  memset(u, 0, sizeof(u));
  Dis tmp, tt;
  tmp.val = 0;
  tmp.pos = st;
  priority_queue<Dis> que;
  que.push(tmp);
  while (!que.empty()) {
    tmp = que.top();
    que.pop();
    int tp = tmp.pos;
    if (u[tp] == 1) continue;
    u[tp] = 1;
    s[st][tp] = tmp.val;
    for (int i = (0); i < (e[tp].size()); i++) {
      int v = e[tp][i];
      if (u[v] == 1) continue;
      tt.pos = v;
      tt.val = tmp.val + val[tp][i];
      que.push(tt);
    }
  }
}
int main() {
  std::ios::sync_with_stdio(0);
  std::cin.tie(0);
  while (cin >> n >> m >> k) {
    for (int i = (1); i < (n + 1); i++) {
      e[i].clear();
      val[i].clear();
    }
    for (int i = (1); i < (m + 1); i++) {
      int x, y, w;
      cin >> x >> y >> w;
      ee[i][0] = x;
      ee[i][1] = y;
      e[x].push_back(y);
      val[x].push_back(w);
      e[y].push_back(x);
      val[y].push_back(w);
    }
    memset(s, -1, sizeof(s));
    for (int i = (1); i < (n + 1); i++) dijkstra(i);
    int ans, mis;
    ans = 0;
    for (int i = (1); i < (k + 1); i++) {
      cin >> rou[i][0] >> rou[i][1];
      ans += s[rou[i][0]][rou[i][1]];
    }
    for (int i = (1); i < (m + 1); i++) {
      mis = 0;
      for (int j = (1); j < (k + 1); j++) {
        int tt = s[rou[j][0]][rou[j][1]];
        tt = min(tt, s[rou[j][0]][ee[i][0]] + s[rou[j][1]][ee[i][1]]);
        tt = min(tt, s[rou[j][1]][ee[i][0]] + s[rou[j][0]][ee[i][1]]);
        mis += tt;
      }
      ans = min(ans, mis);
    }
    cout << ans << '\n';
  }
  return 0;
}
