#include<bits/stdc++.h> #define MAXN 100050 #define MAXM 900000 using namespace std; struct st { int id; long long dis; st(int a,long long b) { id=a; dis=b; } st(){}; }; struct edge{ bool im; int id; long long w; edge *next; }; edge *adj[MAXN]; edge edges[MAXM]; int ednum; inline void add_edge(int a,int b,long long w,bool im){ edge *tmp=&edges[ednum++]; tmp->id=b; tmp->w=w; tmp->im=im; tmp->next=adj[a]; adj[a]=tmp; } bool operator < (const st &a,const st &b){ return a.dis>b.dis; } long long dis[MAXN]; bool used[MAXN]; void dfss(int num) { for(int i=1;i<=MAXN;i++){ dis[i]=999999999999999; } priority_queue<st>q; st tmp; dis[1]=0; q.push(st(1,0)); while(!q.empty()) { tmp=q.top(); q.pop(); if(dis[tmp.id]<tmp.dis)continue; for(edge *p=adj[tmp.id];p;p=p->next) { if(dis[p->id]==p->w+dis[tmp.id]){ if(p->im==0)used[p->id]=0; } if(dis[p->id]>p->w+dis[tmp.id]) { if(p->im)used[p->id]=1; else used[p->id]=0; dis[p->id]=p->w+dis[tmp.id]; q.push(st(p->id,dis[p->id])); } } } } int main() { int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++){ int u,v; long long w; scanf("%d%d%I64d",&u,&v,&w); add_edge(u,v,w,0); add_edge(v,u,w,0); } for(int i=1;i<=k;i++){ int v; long long w; scanf("%d%I64d",&v,&w); add_edge(1,v,w,1); add_edge(v,1,w,1); } dfss(1); int ans=0; for(int i=1;i<=n;i++){ ans+=used[i]; } cout << k-ans << endl; }