#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int N,M,L;
int map[110][110];
int edge[1100][1100];

struct Node
{
	int hou;
	int ti;
}node[1200];
int cx[1100];
int cy[1100];
bool vis[1100];
void  floyed()
{
	for(int k=0;k<N;k++)
		for(int i=0;i<N;i++)
			for(int j=0;j<N;j++)
				{
				if(i!=j&&j!=k&&i!=k)
					{
					map[i][j]=min(map[i][k]+map[k][j],map[i][j]);
					}
				}
}
int path(int u)
{
	int v;
	for(v=0;v<L;v++)
		{
		if(edge[u][v]&&!vis[v])
			{
			vis[v]=1;
			if(cy[v]==-1||path(cy[v]))
				{
				cx[u]=v;
				cy[v]=u;
				return 1;
				}	
			}
		}	
return 0;
}

int main()
{
	while(scanf("%d%d%d",&N,&M,&L)!=EOF)
		{
		if(N==0&&M==0&&L==0)
			break;
		for(int i=0;i<N;i++)
			for(int j=0;j<N;j++)
				{	
					if(i==j)
						map[i][j]=0;
					else
						map[i][j]=0x7fffff;
				}
		for(int i=0;i<M;i++)
			{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			map[a][b]=c;
			map[b][a]=c;
			}
		floyed();
		for(int i=0;i<L;i++)
			{
			int a,b;
			scanf("%d%d",&a,&b);
			node[i].hou=a;
			node[i].ti=b;
			}
		memset(edge,0,sizeof(edge));
		for(int i=0;i<L;i++)
			{
			for(int j=0;j<L;j++)
				{
					if(i!=j&&node[i].ti-node[j].ti>=map[node[i].hou][node[j].hou])
						{
							edge[j][i]=1;
						}
				}
			}
		memset(cx,0xfffff,sizeof(cx));
		memset(cy,0xfffff,sizeof(cy));
		int ans=0;
		for(int i=0;i<L;i++)
			{
			if(cx[i]==-1)
				{
				memset(vis,0,sizeof(vis));
				ans+=path(i);
				}	
			}
		printf("%d\n",L-ans);
		}
    return 0;
}