// Slower C++ solution:
//#pragma GCC optimize("O3")

#include <bits/stdc++.h>



using namespace std;



typedef long long ll;



const int N = (int) 1e5 + 5;

const int mod = (int) 1e9 + 7;



vector<int> g[N];

int n, m, Q, ans[N], ds[N], u[N];

int q[N * 100], qd[N * 100], qb, qe, t = 1, f[N];



void paint (int c) {

        while (qb < qe) {

                int v = q[qb], d = qd[qb++];

                if (ans[v] != 0 && ds[v] >= d) {

                        continue;

                }

                if (!ans[v]) {

                        ans[v] = c; ds[v] = d;

                }else



                {

                        ds[v] = d;

                }

                if (d) {

                        for (int to : g[v]) {

                                if (u[to] != t) {

                                        u[to] = t;

                                        q[qe] = to;

                                        qd[qe++] = d - 1;

                                }

                        }

                }

        }

        qb = qe = 0; ++t;

}



int v[N], d[N], c[N];



inline void solve () {

        scanf ("%d%d", &n, &m);

        for (int i = 1; i <= m; i++) {

                int x, y;

                scanf ("%d%d", &x, &y);

                g[x].emplace_back (y);

                g[y].emplace_back (x);

        }

        scanf ("%d", &Q);

        for (int i = 1; i <= Q; i++) {

                scanf ("%d%d%d", &v[i], &d[i], &c[i]);

        }

        for (int i = Q; i >= 1; i--) {

                q[qe] = v[i]; qd[qe++] = d[i];

                u[v[i]] = t;

                if (c[i] != c[i - 1]) {

                        paint (c[i]);

                }

        }

        for (int i = 1; i <= n; i++) {

                printf ("%d\n", ans[i]);

        }

}



int tests = 1;



int main () {

//        freopen (".in", "r", stdin);

//        freopen (".out", "w", stdout);

//        scanf ("%d", &tests);

        while (tests--) {

                solve ();

        }

        return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.5068440935086747x):
#include<cstdio>

#include<iostream>

#include<queue>

#include<cstring>

#define N 100010

using namespace std;

struct Dis{

	int x,z;

};

queue<Dis>Q;

int a[N],c[N],d[N],e[N],f[N],num,h[N],n,m,p,q,t,col;

bool bo[N];

struct Edge{

	int p,q,n;

}b[N*2];

void ljb(int p,int q){

	b[++num].n=h[p];

	h[p]=num;

	b[num].p=p;

	b[num].q=q;

}

void Bfs(){

	int x,y,z;

	while(!Q.empty()){

		x=Q.front().x; z=Q.front().z; Q.pop(); 

//		printf("%d %d\n",x,z);

		if(!f[x])f[x]=col;

		e[x]=max(e[x],z);

		if(z==0)continue;

		for(int i=h[x];i!=0;i=b[i].n){

			y=b[i].q;

			if(e[y]<z-1)Q.push((Dis){y,z-1});

		}

	}

}

int main(){

	memset(e,-1,sizeof(e));

	scanf("%d%d",&n,&m);

	for(int i=1;i<=m;i++){

		scanf("%d%d",&p,&q);

		ljb(p,q);

		ljb(q,p);

	}

	scanf("%d",&t);

	for(int i=1;i<=t;i++)scanf("%d%d%d",&a[i],&d[i],&c[i]);

	for(int i=t;i>=1;i--){

		if(e[a[i]]>=d[i])continue;

		col=c[i];

		Q.push((Dis){a[i],d[i]});

		Bfs();

	}

//	for(int i=1;i<=n;i++)printf("%d %d\n",i,e[i]);

	for(int i=1;i<=n;i++)printf("%d\n",f[i]);

}