#include <bits/stdc++.h>
using namespace std;
long long dist[500005], head[700005], ecnt, ans;
struct Node {
long long u, v, w, next;
} e[700005];
void add(long long u, long long v, long long w) {
ecnt++;
e[ecnt].u = u;
e[ecnt].v = v;
e[ecnt].w = w;
e[ecnt].next = head[u];
head[u] = ecnt;
}
long long n, m, k;
struct Node2 {
long long num, id;
bool operator < (Node2 const &b) const{
if (b.num == num) {
return b.id < id;
}
return b.num < num;
}
};
priority_queue<Node2> q;
bool vis[700005];
void dijkstra(long long st) {
for (long long i = 1; i <= n; i++) {
dist[i] = 11451419198102147;
}
dist[st] = 0;
q.push((Node2){0, 1});
while (!q.empty()) {
long long num = q.top().num;
long long id = q.top().id;
q.pop();
if (vis[id]) {
continue;
}
vis[id] = 1;
for (long long i = head[id]; i != 0; i = e[i].next) {
long long v = e[i].v;
long long w = e[i].w;
if (dist[id] + w < dist[v]) {
dist[v] = dist[id] + w;
}
q.push((Node2){dist[v], v});
}
}
}
int main() {
cin >> n >> m >> k;
for (long long i = 1; i <= m; i++) {
long long u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
dijkstra(1);
for (long long i = 1; i <= k; i++) {
long long v, w;
cin >> v >> w;
if (dist[v] <= w) {
ans++;
}
}
cout << ans << "\n";
return 0;
}