#include #include #include #include #include #include #include using namespace std; struct Edge { int to; long long weight; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, k; cin >> n >> m >> k; vector> g(n); vector> roads; for (int i = 0; i < m; ++i) { int u, v; long long w; cin >> u >> v >> w; --u; --v; g[u].push_back({v, w}); g[v].push_back({u, w}); roads.push_back({u, v, w}); } const long long inf = numeric_limits::max() / 4; vector train(n, inf), dist(n, inf); for (int i = 0; i < k; ++i) { int v; long long w; cin >> v >> w; --v; train[v] = min(train[v], w); } priority_queue, vector>, greater<>> pq; dist[0] = 0; pq.push({0, 0}); for (int v = 1; v < n; ++v) if (train[v] < inf) { dist[v] = train[v]; pq.push({dist[v], v}); } while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if (d != dist[u]) continue; for (Edge e : g[u]) if (dist[e.to] > d + e.weight) { dist[e.to] = d + e.weight; pq.push({dist[e.to], e.to}); } } vector road_predecessor(n, false); for (auto [u, v, w] : roads) { if (dist[u] + w == dist[v]) road_predecessor[v] = true; if (dist[v] + w == dist[u]) road_predecessor[u] = true; } int needed = 0; for (int v = 1; v < n; ++v) { if (train[v] == dist[v] && !road_predecessor[v]) ++needed; } cout << k - needed << '\n'; }