#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
long long n, a[500005], b[500005], k, m, res = 0, sm = 0, edge = -1, nb = 1,
                                         ans = 0;
multiset<long long> mst;
set<long long> st[500005], st2;
string s1, s2, t1, t2;
vector<long long> vp, vans, v3;
vector<pair<long long, long long> > vv, vv1, adj, v1, v2;
vector<pair<pair<long long, long long>, long long> > vvv;
priority_queue<pair<pair<long long, long long>, long long> > pq;
set<pair<long long, long long> >::iterator it;
set<pair<pair<long long, long long>, long long> >::iterator it1, it2, it3;
map<long long, long long> red, mplose;
long long dx[] = {0, 0, -1, 1};
long long dy[] = {1, -1, 0, 0};
int voyel(char c) {
  if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y')
    return 1;
  return 0;
}
long long parent[500005], sizec[500005];
void make_set(int v) {
  parent[v] = v;
  sizec[v] = 0;
}
long long find_set(int v) {
  if (v == parent[v]) return v;
  return parent[v] = find_set(parent[v]);
}
string solve(long long x, long long y) {
  x = find_set(x);
  if (x == find_set(y) || st[x].find(y) != st[x].end()) return "Yes\n";
  return "No\n";
}
map<long long, vector<long long> > v[500005];
void merge(long long x, long long y) {
  x = find_set(x);
  y = find_set(y);
  if (x == y) return;
  if (st[x].size() > st[y].size()) swap(x, y);
  set<long long>::iterator it;
  for (it = st[x].begin(); it != st[x].end(); it++) {
    st[y].insert(*it);
  }
  st[x].clear();
  parent[x] = y;
}
void add(long long x, long long y, long long c) {
  vector<long long>& z = v[x][c];
  while (z.size()) {
    merge(y, z.back());
    z.pop_back();
  }
  x = find_set(x);
  st[x].insert(y);
  z.push_back(y);
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  long long i = 0, j = 0, x, y, z = 0, mx = 0, nb2 = 0, nb1 = 0, nbmax = 0,
            nbinf = 0, mm = 5e9, idx = 0, ok = 0, l, r, negatif = 0,
            positif = 0, q, d, res1 = 0, flag, color;
  char c;
  cin >> n >> m >> color >> q;
  for (i = 1; i <= n; i++) make_set(i);
  for (i = 1; i <= m; i++) {
    cin >> x >> y >> z;
    add(x, y, z);
    add(y, x, z);
  }
  while (q--) {
    cin >> c >> x >> y;
    if (c == '?') {
      cout << solve(x, y);
    } else {
      cin >> z;
      add(x, y, z);
      add(y, x, z);
    }
  }
  return 0;
}
