#include<bits/stdc++.h>
using namespace std;
long long n,m,k,dis[400010],dis1[400010],cnt,vis[400010];
long long fst[400010],nxt[400010],to[400010],val[400010];
void adde(int u,int v,int w){
cnt++;
nxt[cnt]=fst[u];
fst[u]=cnt;
to[cnt]=v;
val[cnt]=w;
}
struct node{
int u,w;
};
priority_queue<node>q;
bool operator<(node x,node y){
return x.w>y.w;
}
void dijkstra(int s){
memset(dis,0x7f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
q.push((node){s,0});
while(!q.empty()){
int u=q.top().u;
q.pop();
vis[u]=1;
for(int i=fst[u];i;i=nxt[i]){
int v=to[i];
if(!vis[v]&&dis[u]+val[i]<dis[v]){
dis[v]=dis[u]+val[i];
q.push((node){v,dis[v]});
}
}
}
}
int main(){
cin>>n>>m>>k;
for(int i=1,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
adde(x,y,z);
adde(y,x,z);
adde(x+n,y+n,z);
adde(y+n,x+n,z);
}
dijkstra(n);
for(int i=1;i<n;i++)dis1[i]=dis[i];
for(int i=1,x,y;i<=k;i++){
scanf("%d%d",&x,&y);
adde(x+n,x,-y);
}
dijkstra(n+n);
for(int i=1;i<n;i++){
if(dis1[i]<dis[i])printf("0\n");
else printf("1\n");
}
}