#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=(int)1e5+10;
struct node{
	int to,nxt;
}ed[maxn<<1];
int head[maxn],cnt;
void addedge(int u,int v){
	ed[cnt].to=v;
	ed[cnt].nxt=head[u];
	head[u]=cnt++;
}
int st[maxn],d[maxn],c[maxn],mark[maxn],dis[maxn],col[maxn];
int main()
{
	int n,m;
	memset(head,-1,sizeof(head));
	memset(mark,-1,sizeof(mark));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		addedge(u,v);
		addedge(v,u);
	}
	int q;
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d%d",&st[i],&d[i],&c[i]);
	}
	for(int i=q;i>=1;i--){
		if(d[i]<=mark[st[i]])continue;
		queue<int>q;
		memset(dis,0,sizeof(dis));
		q.push(st[i]);
		while(!q.empty()){
			int u=q.front();q.pop();
			if(dis[u]>=mark[st[i]]&&col[u]==0)col[u]=c[i];	
			for(int j=head[u];~j;j=ed[j].nxt){
				int v=ed[j].to;
				if(dis[v]==0&&v!=st[i]&&dis[u]<d[i]){
					dis[v]=dis[u]+1;
					q.push(v);
				}
			}
		}
		mark[st[i]]=d[i];
	}
	for(int i=1;i<=n;i++)printf("%d\n",col[i]);
	return 0;
}