#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6;
const int MAXM = 1e6;
const int inf = 1 << 30;
int n, m, cnt, S, T, in[MAXN], out[MAXN], cur[MAXN], d[MAXN];
vector<int> Eid[MAXN];
struct Edge {
  int c, v;
} E[MAXM];
void AddEdge(int x, int y, int c) {
  if (c == 0) return;
  E[++cnt].v = y, E[cnt].c = c;
  Eid[x].push_back(cnt);
  E[++cnt].v = x, E[cnt].c = 0;
  Eid[y].push_back(cnt);
}
bool BFS() {
  static int Q[MAXN];
  int x, i, ql, qr;
  for (i = 0; i <= T + 4; i++) d[i] = -1;
  Q[ql = qr = 0] = S;
  d[S] = 0;
  while (ql <= qr) {
    x = Q[ql++];
    for (i = 0; i < Eid[x].size(); i++) {
      const Edge &e = E[Eid[x][i]];
      if (e.c && d[e.v] == -1) {
        Q[++qr] = e.v;
        d[e.v] = d[x] + 1;
        if (e.v == T) return 1;
      }
    }
  }
  return 0;
}
int Aug(int x, int a) {
  if (x == T) return a;
  int aug = 0, delta;
  for (int &i = cur[x]; i < Eid[x].size(); i++) {
    Edge &e = E[Eid[x][i]];
    if (e.c && d[e.v] == d[x] + 1) {
      delta = Aug(e.v, min(a, e.c));
      if (delta) {
        e.c -= delta;
        E[Eid[x][i] ^ 1].c += delta;
        aug += delta;
        if (!(a -= delta)) break;
      }
    }
  }
  if (!aug) d[x] = -1;
  return aug;
}
int MaxFlow() {
  int flow = 0;
  while (BFS()) {
    for (int i = 0; i <= T + 4; i++) cur[i] = 0;
    flow += Aug(S, inf);
  }
  return flow;
}
int r, b, t1, t2, X[MAXN], Y[MAXN], t[MAXN], l[MAXN], D[MAXN], dx[MAXN],
    dy[MAXN];
int x[MAXN], y[MAXN], sumx[MAXN], sumy[MAXN], eid[MAXN];
bool bo[MAXN];
long long ans;
int main() {
  cnt = -1;
  scanf("%d%d", &n, &m);
  scanf("%d%d", &r, &b);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", x + i, y + i);
    X[++t1] = x[i];
    Y[++t2] = y[i];
  }
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", t + i, l + i, D + i);
    if (t[i] == 1)
      X[++t1] = l[i];
    else
      Y[++t2] = l[i];
  }
  sort(X + 1, X + 1 + t1);
  t1 = unique(X + 1, X + 1 + t1) - X - 1;
  sort(Y + 1, Y + 1 + t2);
  t2 = unique(Y + 1, Y + 1 + t2) - Y - 1;
  memset(dx, 0x3f, sizeof(dx));
  memset(dy, 0x3f, sizeof(dy));
  for (int i = 1; i <= n; i++) {
    x[i] = lower_bound(X + 1, X + 1 + t1, x[i]) - X;
    y[i] = lower_bound(Y + 1, Y + 1 + t2, y[i]) - Y;
    sumx[x[i]]++;
    sumy[y[i]]++;
  }
  for (int i = 1; i <= m; i++) {
    if (t[i] == 1) {
      l[i] = lower_bound(X + 1, X + 1 + t1, l[i]) - X;
      dx[l[i]] = min(dx[l[i]], D[i]);
    } else {
      l[i] = lower_bound(Y + 1, Y + 1 + t2, l[i]) - Y;
      dy[l[i]] = min(dy[l[i]], D[i]);
    }
  }
  for (int i = 1; i <= n; i++) AddEdge(x[i], t1 + y[i], 1), eid[i] = cnt;
  for (int i = 1; i <= m; i++) {
    int L, R;
    if (t[i] == 1) {
      if (dx[l[i]] < 0) continue;
      L = (sumx[l[i]] - dx[l[i]] + 1) / 2;
      L = max(L, 0);
      R = (sumx[l[i]] + dx[l[i]]) / 2;
      R = min(R, sumx[l[i]]);
      if (L > R) return puts("-1");
      AddEdge(t1 + t2 + 1, l[i], R - L);
      AddEdge(t1 + t2 + 3, l[i], L);
      AddEdge(t1 + t2 + 1, t1 + t2 + 4, L);
      dx[l[i]] = -1;
      ans += L;
    } else {
      if (dy[l[i]] < 0) continue;
      L = (sumy[l[i]] - dy[l[i]] + 1) / 2;
      L = max(L, 0);
      R = (sumy[l[i]] + dy[l[i]]) / 2;
      R = min(R, sumy[l[i]]);
      if (L > R) return puts("-1");
      AddEdge(t1 + l[i], t1 + t2 + 2, R - L);
      AddEdge(t1 + t2 + 3, t1 + t2 + 2, L);
      AddEdge(t1 + l[i], t1 + t2 + 4, L);
      dy[l[i]] = -1;
      ans += L;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (dx[x[i]] > 0) AddEdge(t1 + t2 + 1, x[i], sumx[x[i]]);
    if (dy[y[i]] > 0) AddEdge(t1 + y[i], t1 + t2 + 2, sumy[y[i]]);
  }
  AddEdge(t1 + t2 + 2, t1 + t2 + 1, inf);
  S = t1 + t2 + 3;
  T = t1 + t2 + 4;
  if (ans != MaxFlow()) return puts("-1");
  ans = E[cnt].c;
  E[cnt].c = 0;
  S = t1 + t2 + 1;
  T = t1 + t2 + 2;
  ans += MaxFlow();
  ans = ans * min(r, b) + (n - ans) * max(r, b);
  cout << ans << endl;
  char A, B;
  if (r < b)
    A = 'r', B = 'b';
  else
    A = 'b', B = 'r';
  for (int i = 1; i <= n; i++) {
    if (E[eid[i]].c == 1)
      putchar(A);
    else
      putchar(B);
  }
}
