#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,int> pii;
int head[100001],to[600001],nxt[600001],com[100001],cnt;
long long w[600001],dis[100001];
bool vis[500001];
inline void add(int x,int y,long long z){
nxt[++cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
w[cnt]=z;
}
priority_queue<pii,vector<pii>,greater<pii> >q;
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int x,y;
long long z;
for(int i=1;i<=m;++i){
scanf("%d%d%lld",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=k;++i){
scanf("%d%lld",&x,&z);
add(1,x,z);
}
memset(dis,-1,sizeof(dis));
dis[1]=0;
m<<=1;
q.push(make_pair(0,1));
while(!q.empty()){
pii o=q.top();
q.pop();
int u=o.second;
if(vis[u])continue;
vis[u]=true;
int i=head[u];
while(i){
if(dis[to[i]]>dis[u]+w[i]||dis[to[i]]==-1){
dis[to[i]]=dis[u]+w[i];
com[to[i]]=i;
q.push(make_pair(dis[to[i]],to[i]));
}else if(i<=m&&com[to[i]]>m&&dis[to[i]]==dis[u]+w[i])com[to[i]]=i;
i=nxt[i];
}
}
//1e5
memset(vis,false,sizeof(vis));
int ans=0;
for(int i=1;i<=n;++i)
if(com[i]>m){
if(!vis[com[i]])++ans;
vis[com[i]]=true;
}
printf("%d",k-ans);
return 0;
}