import sys from collections import deque reader = (int(token) for line in sys.stdin for token in line.split()) n = next(reader) m = next(reader) A = next(reader) B = next(reader) w = [] e = [] for i in range(n): x = next(reader) y = next(reader) if x == 0: w.append((y, i)) elif x == A: e.append((y, i)) max_e = 2 * m head = [-1] * n rhead = [-1] * n to = [0] * max_e nxt = [0] * max_e rto = [0] * max_e rnxt = [0] * max_e ec = 0 rec = 0 for _ in range(m): u = next(reader) - 1 v = next(reader) - 1 k = next(reader) to[ec] = v nxt[ec] = head[u] head[u] = ec ec += 1 rto[rec] = u rnxt[rec] = rhead[v] rhead[v] = rec rec += 1 if k == 2: to[ec] = u nxt[ec] = head[v] head[v] = ec ec += 1 rto[rec] = v rnxt[rec] = rhead[u] rhead[u] = rec rec += 1 vis = [False] * n q = deque([i for y, i in w]) for i in q: vis[i] = True while q: v = q.popleft() idx = head[v] while idx != -1: t = to[idx] if not vis[t]: vis[t] = True q.append(t) idx = nxt[idx] valid_e = [(y, i) for y, i in e if vis[i]] valid_e.sort() mx = [-1] * n q = deque() for i in range(len(valid_e) - 1, -1, -1): _, node = valid_e[i] if mx[node] == -1: mx[node] = i q.append(node) while q: v = q.popleft() idx = rhead[v] while idx != -1: t = rto[idx] if mx[t] == -1: mx[t] = i q.append(t) idx = rnxt[idx] mn = [-1] * n for i in range(len(valid_e)): _, node = valid_e[i] if mn[node] == -1: mn[node] = i q.append(node) while q: v = q.popleft() idx = rhead[v] while idx != -1: t = rto[idx] if mn[t] == -1: mn[t] = i q.append(t) idx = rnxt[idx] w.sort(reverse=True) ans = [] for y, i in w: if mx[i] != -1 and mn[i] != -1: ans.append(str(mx[i] - mn[i] + 1)) else: ans.append("0") print('\n'.join(ans))