// Slower C++ solution:
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <sstream>

#include <iomanip>

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <cctype>

#include <cstring>

#include <vector>

#include <list>

#include <queue>

#include <deque>

#include <stack>

#include <map>

#include <set>

#include <algorithm>

#include <iterator>

#include <bitset>

#include <ctime>

#include<complex>

using namespace std;



#define FOR(i,a,b) for (int i = (a); i < (b); i++)

#define RFOR(i,b,a) for (int i = (b)-1; i >= (a); i--)

#define ITER(it,a) for (__typeof(a.begin()) it = a.begin(); it != a.end(); it++)

#define FILL(a,value) memset(a, value, sizeof(a))



#define SZ(a) (int)a.size()

#define ALL(a) a.begin(), a.end()

#define PB push_back

#define MP make_pair



typedef long long LL;

typedef vector<int> VI;

typedef pair<int, int> PII;



const double PI = acos(-1.0);

const int INF = 1000 * 1000 * 1000 + 7;

const LL LINF = INF * (LL)INF;



const int MAX = 1000 * 100 + 47;



struct Item

{

	int v, d, c;

};



Item Q[MAX];

vector<int> g[MAX];

int U[MAX];

int D[MAX];

int C[MAX];

int iter;



void dfs(int v, int d, int curD, int color)

{

	if (d > curD) return;

	if (curD - d <= D[v]) return;

	D[v] = curD - d;

	if (C[v] == 0) C[v] = color;

	FOR(i, 0, SZ(g[v]))

	{

		int to = g[v][i];

		dfs(to, d + 1, curD, color);

	}

}



int main()

{

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

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

	//ios::sync_with_stdio(false); cin.tie(0);

	int n, m;

	cin >> n >> m;

	FOR(i, 0, m)

	{

		int a, b;

		cin >> a >> b;

		a--;

		b--;

		g[a].push_back(b);

		g[b].push_back(a);

	}



	int q;

	cin >> q;

	FOR(i, 0, q)

	{

		cin >> Q[i].v >> Q[i].d >> Q[i].c;

		Q[i].v--;

	}



	reverse(Q, Q + q);

	FILL(D, -1);

	FOR(i, 0, q)

	{

		dfs(Q[i].v, 0, Q[i].d, Q[i].c);

	}



	FOR(i, 0, n)

	{

		//cout << i + 1 << ": " << C[i] << "\n";

		cout << C[i] << "\n";



	}

}

// Faster C++ solution for the same problem (measured speedup: 1.1189539157566084x):
#include<bits/stdc++.h>

#include<cmath>

#include<math.h>

#include<ctype.h>

#include<algorithm>

#include<string.h>

#include<stdio.h>

#include<iostream>

#define f(i,n) for (int i=0;i<(n);i++)

#define f1(i,n) for (int i=1;i<=(n);i++)

#define pb push_back

#define ms(a) memset((a),0,sizeof(a))

#define ll long long

#define vi vector<int>

#define mp make_pair

#define die assert(fasle)

#define pii pair<int,int>

#define INF 0x3f3f3f3f

#define N (int)1e5+5

using namespace std;

int n, m, q;

vi g[N];

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

int ans[N];

int lft;

int mds[N];

void dfs(int vv, int dd, int cc) {

	if (!lft) return;

	if (dd < 0) return;

	if (!ans[vv])ans[vv] = cc;

	if (dd <= mds[vv]) return;

	mds[vv] = dd;

	//printf("%d %d %d\n", vv, dd, cc);

	for (int i = 0; i < g[vv].size(); i ++) {

		if (!g[vv][i])lft --;

		dfs(g[vv][i], dd-1, cc);

	}

}

int main() {

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

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

		int x, y;

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

		g[x].pb(y);

		g[y].pb(x);

	}

	scanf("%d", &q);

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

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

	}

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

		mds[i] = -1;

	}

	lft = n;

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

		//puts("");

		dfs(v[i], d[i], c[i]);

//		for (int j = 1; j <= n; j ++) {

//			printf("%d ", ans[j]);

//		}

//		puts("");

//		printf("%d\n", lft);

//		puts("");

		if (!lft) break;

	}

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

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

	}

	return 0;

}