#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = v * 10 + c - '0';
  while (isdigit(c = getchar())) v = v * 10 + c - '0';
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while ((c = getchar()) == ' ' || c == '\n')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
int n, m, c, q;
int i, j, blk = 1000;
int fa[100005], typ[100005], deg[100005];
char op[100005];
int px[100005], py[100005], pz[100005], qx[100005], qy[100005], qz[100005];
set<int> s[100005];
map<int, int> lst[100005];
vector<int> e[100005];
int fnd(int x) {
  if (fa[x] == x) return x;
  return fa[x] = fnd(fa[x]);
}
void mrg(int x, int y) {
  x = fnd(x);
  y = fnd(y);
  if (x == y) return;
  if (s[x].size() > s[y].size()) swap(x, y);
  fa[x] = y;
  for (__typeof((s[x]).begin()) it = (s[x]).begin(); it != (s[x]).end(); it++)
    s[y].insert(*it);
  s[x].clear();
}
void add(int x, int y, int z) {
  if (lst[x].count(z)) mrg(lst[x][z], y);
  if (lst[y].count(z)) mrg(lst[y][z], x);
  if (typ[y] == 2) s[fnd(x)].insert(y);
  if (typ[x] == 2) s[fnd(y)].insert(x);
  lst[x][z] = y;
  lst[y][z] = x;
  e[x].push_back(y);
  e[y].push_back(x);
}
int main() {
  read(n);
  read(m);
  read(c);
  read(q);
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    int x, y, z;
    read(x);
    read(y);
    read(z);
    qx[i] = x;
    qy[i] = y;
    qz[i] = z;
    deg[x]++;
    deg[y]++;
  }
  for (((i)) = (1); ((i)) <= ((q)); ((i))++) {
    readc(op[i]);
    if (op[i] == '+') {
      read(px[i]);
      read(py[i]);
      read(pz[i]);
      deg[px[i]]++;
      deg[py[i]]++;
    } else {
      read(px[i]);
      read(py[i]);
    }
  }
  for (((i)) = (1); ((i)) <= ((n)); ((i))++)
    if (deg[i] <= blk)
      typ[i] = 1;
    else
      typ[i] = 2;
  for (((i)) = (1); ((i)) <= ((n)); ((i))++)
    if (typ[i] == 2) {
      s[i].insert(i);
    }
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) fa[i] = i;
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) add(qx[i], qy[i], qz[i]);
  for (((i)) = (1); ((i)) <= ((q)); ((i))++) {
    if (op[i] == '+')
      add(px[i], py[i], pz[i]);
    else {
      if (typ[py[i]] == 1) {
        if (fnd(px[i]) == fnd(py[i])) {
          puts("Yes");
          continue;
        }
        bool flg = 0;
        for (__typeof((e[py[i]]).begin()) it = (e[py[i]]).begin();
             it != (e[py[i]]).end(); it++)
          if (fnd(px[i]) == fnd(*it)) {
            puts("Yes");
            flg = 1;
            break;
          }
        if (!flg) puts("No");
      } else {
        if (s[fnd(px[i])].count(py[i])) {
          puts("Yes");
        } else {
          puts("No");
        }
      }
    }
  }
  return 0;
}
