#include <bits/stdc++.h>
using namespace std;
template <class T>
T sqr(T x) {
  return x * x;
}
template <class T>
T gcd(T a, T b) {
  return (b != 0 ? gcd<T>(b, a % b) : a);
}
template <class T>
T lcm(T a, T b) {
  return (a / gcd<T>(a, b) * b);
}
template <class T>
inline T bigmod(T p, T e, T M) {
  if (e == 0) return 1;
  if (e % 2 == 0) {
    long long int t = bigmod(p, e / 2, M);
    return (T)((t * t) % M);
  }
  return (T)((long long int)bigmod(p, e - 1, M) * (long long int)p) % M;
}
template <class T>
inline T bigexp(T p, T e) {
  if (e == 0) return 1;
  if (e % 2 == 0) {
    long long int t = bigexp(p, e / 2);
    return (T)((t * t));
  }
  return (T)((long long int)bigexp(p, e - 1) * (long long int)p);
}
template <class T>
inline T modinverse(T a, T M) {
  return bigmod(a, M - 2, M);
}
int dx4[] = {1, 0, -1, 0};
int dy4[] = {0, 1, 0, -1};
int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1};
int dy8[] = {0, 1, 1, 1, 0, -1, -1, -1};
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n, m, k, x, y, c, t, f[100005];
long long int d[100005], b[100005];
vector<int> ed[100005], cost[100005];
bool ch[100005];
struct T {
  int ct;
  long long int w;
  bool operator<(const T& p) const { return w > p.w; }
};
int dijktra() {
  priority_queue<T> pq;
  T u, v;
  for (int i = 1; i <= n; i++) d[i] = 1000000000000000000LL;
  u.ct = 1;
  u.w = 0LL;
  d[1] = 0;
  pq.push(u);
  int spoil = 0;
  for (__typeof(t) i = (1); i <= (t); i++) {
    u.ct = f[i];
    u.w = b[f[i]];
    d[f[i]] = u.w;
    ch[f[i]] = true;
    pq.push(u);
  }
  while (!pq.empty()) {
    u = pq.top();
    pq.pop();
    if (d[u.ct] < u.w) continue;
    for (int i = 0; i < ed[u.ct].size(); i++) {
      v.ct = ed[u.ct][i];
      v.w = d[u.ct] + (long long int)cost[u.ct][i];
      if (v.w < d[v.ct]) {
        d[v.ct] = v.w;
        ch[v.ct] = false;
        pq.push(v);
      } else if (d[v.ct] == v.w && ch[v.ct] == true) {
        ch[v.ct] = false;
      }
    }
  }
  for (int i = 1; i <= n; i++)
    if (ch[i] == true) spoil++;
  return k - spoil;
}
int main() {
  int u, v;
  scanf("%d %d %d", &n, &m, &k);
  for (__typeof(m) i = (1); i <= (m); i++) {
    scanf("%d %d %d", &u, &v, &x);
    ed[u].push_back(v);
    ed[v].push_back(u);
    cost[u].push_back(x);
    cost[v].push_back(x);
  }
  for (__typeof(k) i = (1); i <= (k); i++) {
    scanf("%d %d", &x, &y);
    if (b[x] == 0) f[++t] = x;
    if (b[x] == 0)
      b[x] = y;
    else {
      if (y < b[x]) {
        b[x] = y;
        c++;
      }
    }
  }
  k = k - c;
  c += dijktra();
  printf("%d\n", c);
  return 0;
}
