#include <bits/stdc++.h>
#pragma GCC optimize("O0")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("-ffloat-store")
using namespace std;
long long n, m, a, b, k, temp, x, y;
const int MAXN = 100000 + 11;
inline void read(vector<long long> &v);
inline long long max(long long a, long long b);
inline long long min(long long a, long long b);
inline long long gcd(long long a, long long b);
class DisjSet {
  int *rank, *parent, n, *sze, comp;
  long long int *roadsum;

 public:
  DisjSet(int n) {
    rank = new int[n];
    parent = new int[n];
    sze = new int[n];
    comp = n;
    roadsum = new long long int[n];
    this->n = n;
    makeSet();
  }
  void makeSet() {
    for (int i = 0; i < n; i++) {
      parent[i] = i;
      sze[i] = 1;
      roadsum[i] = 0;
    }
  }
  int find(int x) {
    if (parent[x] != x) {
      parent[x] = find(parent[x]);
    }
    return parent[x];
  }
  int getsize(int x) { return sze[find(x)]; }
  long long getsum(int x) { return roadsum[find(x)]; }
  void Union(int x, int y, long long int len) {
    int xset = find(x);
    int yset = find(y);
    roadsum[yset] += len;
    if (xset == yset) return;
    comp--;
    if (rank[xset] < rank[yset]) {
      parent[xset] = yset;
      sze[yset] += sze[xset];
      roadsum[yset] += roadsum[xset];
    } else if (rank[xset] > rank[yset]) {
      parent[yset] = xset;
      sze[xset] += sze[yset];
      roadsum[xset] += roadsum[yset];
    } else {
      parent[yset] = xset;
      sze[xset] += sze[yset];
      roadsum[xset] += roadsum[yset];
      rank[xset] = rank[xset] + 1;
    }
  }
  int getcomps() { return comp; }
};
void solveforthiscase(const int &test) {
  int p, q;
  cin >> n >> m >> p >> q;
  class DisjSet c(n);
  while (m--) {
    long long l;
    cin >> a >> b >> l;
    c.Union(a - 1, b - 1, l);
  }
  if (c.getcomps() < q || (p && q == n)) {
    cout << "NO\n";
    return;
  }
  set<pair<long long, long long> > s;
  for (int i = 0; i < n; i++) s.insert({c.getsum(i), c.find(i)});
  vector<pair<long long, long long> > ans;
  while (s.size() > q && p) {
    p--;
    if (false) cerr << "p" << ' ' << '=' << ' ' << p << '\n';
    int u = (*s.begin()).second;
    long long c1 = (*s.begin()).first;
    s.erase(s.begin());
    int v = (*s.begin()).second;
    long long c2 = (*s.begin()).first;
    s.erase(s.begin());
    if (false) cerr << "u + 1" << ' ' << '=' << ' ' << u + 1 << '\n';
    if (false) cerr << "v + 1" << ' ' << '=' << ' ' << v + 1 << '\n';
    c.Union(u, v, min(c1 + c2 + 1, 1e9));
    s.insert({c.getsum(u), c.find(u)});
    ans.push_back({u + 1, v + 1});
    if (false) cerr << "p" << ' ' << '=' << ' ' << p << '\n';
    if (false) cerr << "s.size()" << ' ' << '=' << ' ' << s.size() << '\n';
  }
  while (p--) {
    if (ans.size())
      ans.push_back(ans.back());
    else {
      vector<int> vis(MAXN, -1);
      for (int i = 0; i < n; i++)
        if (vis[c.find(i)] == -1)
          vis[c.find(i)] = i + 1;
        else {
          ans.push_back({i + 1, vis[c.find(i)]});
          break;
        }
    }
  }
  if (s.size() != q) {
    cout << "NO\n";
    return;
  }
  cout << "YES\n";
  for (auto x : ans) cout << x.first << ' ' << x.second << '\n';
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  cin.tie(NULL);
  cout.tie(NULL);
  clock_t start, end;
  start = clock();
  int test = 1;
  for (int i = 1; i <= test; i++) {
    solveforthiscase(i);
  }
  end = clock();
  long double time_taken =
      (long double)(end - start) / (long double)(CLOCKS_PER_SEC);
  if (false)
    cerr << "Time taken by program is : " << (long double)time_taken * 1000
         << " milisec ";
}
inline long long max(long long a, long long b) { return ((a > b) ? a : b); }
inline long long min(long long a, long long b) { return ((a > b) ? b : a); }
inline long long gcd(long long a, long long b) {
  if (b == 0) return a;
  a %= b;
  return gcd(b, a);
}
inline void read(vector<long long> &v) {
  for (int i = 0; i < v.size(); i++) cin >> v[i];
}
