#include <bits/stdc++.h>
using namespace std;
struct pen
{
int d, c, t;
};
vector<int> graph[100005];
deque<pen> queries[100005];
struct query
{
int v, d, c;
};
query qry[100005];
int rem_dist[100005];
int color[100005];
void bfs(int qidx)
{
int v = qry[qidx].v;
int d = qry[qidx].d;
int c = qry[qidx].c;
if (rem_dist[v] >= d) return;
queue<pair<int, int>> que;
if (rem_dist[v] == -1) color[v] = d;
rem_dist[v] = d;
que.emplace(v, d);
while (que.empty() == false)
{
int vv, dd;
tie(vv, dd) = que.front();
que.pop();
if (dd == 0) continue;
for (int nxt : graph[vv])
{
if (rem_dist[nxt] >= dd - 1) continue;
if (rem_dist[nxt] == -1) color[nxt] = d;
rem_dist[nxt] = dd - 1;
que.emplace(nxt, dd - 1);
}
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
graph[a].push_back(b);
graph[b].push_back(a);
}
for (int i = 1; i <= n; i++) rem_dist[i] = -1;
int q;
scanf("%d", &q);
for (int i = 0; i < q; i++)
{
int v, d, c;
scanf("%d%d%d", &v, &d, &c);
qry[i] = {v, d, c};
while (queries[v].empty() == false && queries[v].back().d <= d) queries[v].pop_back();
queries[v].push_back({ d, c, i });
}
for (int i = q - 1; i >= 0; i--)
{
bfs(i);
}
for (int i = 1; i <= n; i++) printf("%d\n", color[i]);
}