#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000000000")
using namespace std;
const long long int INF = 1e8;
vector<pair<int, long long int> > g[500000];
int used[500000];
int typ[500000];
int typ2[500000];
long long int sum[500000];
void dfs(int id, int now) {
  if (typ[now] != id) typ2[now] = id;
  used[id] = now;
  for (int i = 0; i < ((int)g[id].size()); i++) {
    int to = g[id][i].first;
    sum[now] += g[id][i].second;
    if (!used[to]) dfs(to, now);
  }
}
int dsu[500000];
int get_p(int a) {
  if (dsu[a] == a) return a;
  return dsu[a] = get_p(a);
}
void un(int a, int b) {
  a = get_p(a);
  b = get_p(b);
  typ2[a] = typ[b];
  dsu[b] = a;
  long long int s1 = min((long long int)1e9, sum[a] + sum[b] + 1);
  sum[a] += sum[b] + s1;
}
int main() {
  int n, m, p, q;
  cin >> n >> m >> p >> q;
  for (int i = 0; i < (m); i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    a--;
    b--;
    g[a].push_back(make_pair(b, c));
    g[b].push_back(make_pair(a, c));
  }
  memset(used, 0, sizeof used);
  memset(sum, 0, sizeof sum);
  memset(typ2, -1, sizeof typ2);
  int tim = 0;
  for (int i = 0; i < (n); i++) {
    if (!used[i]) {
      tim++;
      typ[tim] = i;
      dfs(i, tim);
      sum[tim] /= 2;
    }
  }
  if (tim < q) {
    cout << "NO";
    return 0;
  }
  vector<pair<int, int> > out;
  set<pair<long long int, int> > good;
  for (int i = 0; i < (tim + 1); i++) {
    if (!i) continue;
    dsu[i] = i;
    good.insert(make_pair(sum[i], i));
  }
  while (p) {
    if ((int)good.size() > q) {
      int f = good.begin()->second;
      good.erase(good.begin());
      int s = good.begin()->second;
      good.erase(good.begin());
      out.push_back(make_pair(typ[f], typ[s]));
      un(f, s);
      f = get_p(f);
      good.insert(make_pair(sum[f], f));
      tim--;
    } else {
      int f;
      while (!good.empty()) {
        f = good.begin()->second;
        if (typ2[f] == -1) {
          good.erase(good.begin());
        } else
          break;
      }
      if (good.empty()) {
        cout << "NO";
        return 0;
      }
      out.push_back(make_pair(typ[f], typ2[f]));
    }
    p--;
  }
  if (tim != q) {
    cout << "NO";
    return 0;
  }
  cout << "YES" << endl;
  for (int i = 0; i < ((int)out.size()); i++) {
    printf("%d %d\n", out[i].first + 1, out[i].second + 1);
  }
}
