This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
typedef pair<int, int> pii;
const int maxn = 3e5+10;
const int inf = 1e9+10;
int n, m, A, B;
int x[maxn], y[maxn];
int in[maxn], low[maxn], scc[maxn], tt, cc;
int mnScc[maxn], mxScc[maxn];
int up[maxn], down[maxn], mp[maxn];
bool mark[maxn], isEast[maxn], isWest[maxn];
bool sccEast[maxn], reach[maxn];
vector<int> grafo[maxn];
vector<int> dag[maxn], dagT[maxn], topo;
stack<int> stk;
void dfs(int u)
{
	in[u] = low[u] = ++tt;
	stk.push(u);
	for (auto v: grafo[u])
	{
		if (in[v])
		{
			low[u] = min(low[u], in[v]);
			continue;
		}
		dfs(v);
		low[u] = min(low[u], low[v]);
	}
	if (in[u] == low[u])
	{
		++cc;
		while (true)
		{
			int v = stk.top(); stk.pop();
			scc[v] = cc, in[v] = inf;
			if (isEast[v])
				sccEast[cc] = true;
			if (v == u) break;
		}
	}
}
void topsort(int u)
{
	mark[u] = true;
	for (auto v: dag[u])
		if (!mark[v])
			topsort(v);
	topo.push_back(u);
}
void getWest(void)
{
	reverse(topo.begin(), topo.end());
	for (auto u: topo)
	{
		if (sccEast[u])
			reach[u] = true;
		for (auto v: dagT[u])
			reach[u] |= reach[v];
	}
	reverse(topo.begin(), topo.end());
}
void getEast(void)
{
	for (int i = 1; i <= cc; i++)
		up[i] = 0, down[i] = inf;
	for (auto u: topo)
	{
		up[u] = max(up[u], mxScc[u]);
		down[u] = min(down[u], mnScc[u]);
		for (auto v: dag[u])
		{
			up[u] = max(up[u], up[v]);
			down[u] = min(down[u], down[v]);
		}
	}
}
int main(void)
{
	scanf("%d %d %d %d", &n, &m, &A, &B);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d %d", &x[i], &y[i]);
		if (x[i] == 0) isEast[i] = true;
		if (x[i] == A) isWest[i] = true;
	}
	for (int i = 1; i <= m; i++)
	{
		int u, v, w;
		scanf("%d %d %d", &u, &v, &w);
		if (w == 1)
			grafo[u].push_back(v);
		else
		{
			grafo[u].push_back(v);
			grafo[v].push_back(u);
		}
	}
	for (int i = 1; i <= n; i++)
		if (!in[i])
			dfs(i);
	for (int i = 1; i <= n; i++)
	{
		for (auto v: grafo[i])
		{
			if (scc[i] != scc[v])
			{
				dag[scc[i]].push_back(scc[v]);
				dagT[scc[v]].push_back(scc[i]);
			}
		}
	}
	for (int i = 1; i <= cc; i++)
		if (!mark[i])
			topsort(i);
	getWest();
	vector<pii> V;
	for (int i = 1; i <= n; i++)
		if (isWest[i])
			V.push_back({y[i], i});
	sort(V.begin(), V.end());
	int aux = 0;
	for (auto u: V)
		if (reach[scc[u.ss]])
			mp[u.ss] = ++aux;
	for (int i = 1; i <= cc; i++)
		mnScc[i] = inf, mxScc[i] = 0;
	for (int i = 1; i <= n; i++)
	{
		if (reach[scc[i]] && isWest[i])
		{
			mnScc[scc[i]] = min(mnScc[scc[i]], mp[i]);
			mxScc[scc[i]] = max(mxScc[scc[i]], mp[i]);
		}
	}
	getEast();
	V.clear();
	for (int i = 1; i <= n; i++)
		if (isEast[i])
			V.push_back({y[i], i});
	sort(V.begin(), V.end());
	for (int i = V.size()-1; i >= 0; i--)
	{
		int u = V[i].ss;
		if (!up[scc[u]]) printf("0\n");
		else printf("%d\n", up[scc[u]]-down[scc[u]]+1);
	}
}
Compilation message (stderr)
tra.cpp: In function 'int main()':
tra.cpp:113:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d", &n, &m, &A, &B);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tra.cpp:117:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &x[i], &y[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
tra.cpp:126:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &u, &v, &w);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |