#include <bits/stdc++.h>
const long long d9 = 1000 * 1000 * 1000;
using namespace std;
int n, m, p, q;
bool was[100005];
int came[100005];
vector<int> g[100005];
vector<int> gw[100005];
int k, kk;
vector<int> comp[100005];
long long w[100005];
int num[100005];
void dfs(int cur) {
  was[cur] = true;
  comp[k].push_back(cur);
  for (int i = 0; i < g[cur].size(); i++) {
    w[k] += gw[cur][i];
    if (!was[g[cur][i]]) {
      dfs(g[cur][i]);
    }
  }
}
void heapify(int i) {
  int l = 2 * i;
  int r = l + 1;
  int y = i;
  if (l <= k && w[y] > w[l]) y = l;
  if (r <= k && w[y] > w[r]) y = r;
  if (y != i) {
    swap(w[i], w[y]);
    swap(num[i], num[y]);
    heapify(y);
  }
}
void build() {
  for (int i = k / 2; i > 0; i--) heapify(i);
}
int main() {
  scanf("%d %d %d %d", &n, &m, &p, &q);
  for (int i = 0; i < m; i++) {
    int x, y, l;
    scanf("%d %d %d", &x, &y, &l);
    g[x].push_back(y);
    g[y].push_back(x);
    gw[x].push_back(l);
    gw[y].push_back(l);
  }
  for (int i = 1; i <= n; i++) {
    if (!was[i]) {
      k++;
      dfs(i);
      w[k] /= 2;
      num[k] = k;
    }
  }
  if (k < q || (k == q && m == 0 && p > 0) || (k > q && p < k - q)) {
    cout << "NO";
    return 0;
  }
  cout << "YES\n";
  build();
  kk = k;
  for (int i = 1; i <= kk - q; i++) {
    int x;
    if (k == 2 || (k > 2 && w[2] < w[3]))
      x = 2;
    else
      x = 3;
    printf("%d %d\n", comp[num[1]][0], comp[num[x]][0]);
    w[1] = w[1] + w[x] + min(w[1] + w[x] + 1, d9);
    for (int i = 0; i < comp[num[x]].size(); i++)
      comp[num[1]].push_back(comp[num[x]][i]);
    swap(w[x], w[k]);
    swap(num[x], num[k]);
    k--;
    heapify(x);
    heapify(1);
  }
  p -= kk - q;
  if (p == 0) return 0;
  while (w[1] == 0) {
    swap(w[1], w[k]);
    swap(num[1], num[k]);
    k--;
    heapify(1);
  }
  for (int i = 1; i <= p; i++) {
    w[1] += d9;
    printf("%d %d\n", comp[num[1]][0], comp[num[1]][1]);
    heapify(w[0]);
  }
  return 0;
}
