#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int L;
int R;
struct data {
  int u;
  int f;
  int dis;
  int dep;
};
queue<data> q1, q2;
struct ed {
  int v;
  int val;
  int siz;
  int ori;
  friend bool operator<(ed a, ed b) { return a.siz < b.siz; }
};
vector<ed> v[N];
int ng[N];
int tim;
int nsiz[N];
int w[N];
int nu[N];
int siz[N];
bool cut[N];
int ans1;
int ans2;
struct dq {
  int q[3 * N];
  int hd;
  int tl;
  inline void clr() {
    hd = 1;
    tl = 0;
  }
  inline bool emp() { return hd <= tl; }
  inline void ins(int j) {
    while (hd <= tl && w[j] >= w[q[tl]]) tl--;
    q[++tl] = j;
  }
  inline void del(int k) {
    while (hd <= tl && q[hd] > k) hd++;
  }
  inline int qmx() { return q[hd]; }
} q;
inline void clear(queue<data>& q) {
  queue<data> emp;
  swap(q, emp);
}
inline int dfs1(int u, int f) {
  siz[u] = 1;
  for (vector<ed>::iterator it = v[u].begin(); it != v[u].end(); ++it)
    if (it->v != f && !cut[it->v]) siz[u] += dfs1(it->v, u);
  return siz[u];
}
inline int find(int u, int f, const int& tot) {
  for (vector<ed>::iterator it = v[u].begin(); it != v[u].end(); ++it)
    if (it->v != f && !cut[it->v] && 2 * siz[it->v] >= tot)
      return find(it->v, u, tot);
  return u;
}
inline int dfs3(int u, int f) {
  int mx = 0;
  for (vector<ed>::iterator it = v[u].begin(); it != v[u].end(); ++it)
    if (it->v != f && !cut[it->v]) mx = max(mx, dfs3(it->v, u));
  return mx + 1;
}
inline bool bfs(data st, int mxsiz) {
  q.clr();
  clear(q1);
  clear(q2);
  int j = min(R, mxsiz);
  for (; j >= L; j--) q.ins(j);
  for (q1.push(st); !q1.empty();) {
    data nw = q1.front();
    q2.push(nw);
    q1.pop();
    if (nw.dep > R) continue;
    int dl = max(L - nw.dep, 0);
    int dr = min(R - nw.dep, mxsiz);
    for (; j >= dl; j--) q.ins(j);
    q.del(dr);
    if (q.emp()) {
      int p = q.qmx();
      if (nw.dis + w[p] >= 0) {
        ans1 = nu[p];
        ans2 = nw.u;
        return true;
      }
    }
    for (vector<ed>::iterator it = v[nw.u].begin(); it != v[nw.u].end(); ++it)
      if (it->v != nw.f && !cut[it->v])
        q1.push((data){it->v, nw.u, nw.dis + it->val, nw.dep + 1});
  }
  for (; !q2.empty(); q2.pop()) {
    data a = q2.front();
    if (w[a.dep] < a.dis) w[a.dep] = a.dis, nu[a.dep] = a.u;
  }
  return false;
}
inline bool solve(int u) {
  ++tim;
  int g;
  if (ng[tim] == -1) {
    dfs1(u, 0);
    g = find(u, 0, siz[u]);
    cut[g] = true;
    ng[tim] = g;
    nsiz[tim] = siz[u];
    if (siz[u] == 1) return false;
    for (int i = 1; i <= siz[u]; i++) w[i] = -0x3f3f3f3f, nu[i] = 0;
    for (vector<ed>::iterator it = v[g].begin(); it != v[g].end(); ++it)
      if (!cut[it->v]) it->siz = dfs3(it->v, g);
    sort(v[g].begin(), v[g].end());
    w[0] = 0;
    nu[0] = g;
  } else {
    g = ng[tim];
    cut[g] = true;
    if (nsiz[tim] == 1) return false;
    for (int i = 1; i <= nsiz[tim]; i++) w[i] = -0x3f3f3f3f, nu[i] = 0;
    w[0] = 0;
    nu[0] = g;
  }
  for (vector<ed>::iterator it = v[g].begin(); it != v[g].end(); ++it)
    if (!cut[it->v])
      if (bfs((data){it->v, g, it->val, 1}, it->siz)) return true;
  for (vector<ed>::iterator it = v[g].begin(); it != v[g].end(); ++it)
    if (!cut[it->v])
      if (solve(it->v)) return true;
  return false;
}
inline bool jud(int mid) {
  tim = 0;
  for (int i = 1; i <= n; i++)
    for (vector<ed>::iterator it = v[i].begin(); it != v[i].end(); ++it)
      it->val = (it->ori >= mid) ? 1 : -1;
  for (int i = 1; i <= n; i++) cut[i] = false;
  return solve(1);
}
int main() {
  scanf("%d%d%d", &n, &L, &R);
  int l = 0;
  int r = 0;
  for (int i = 1; i <= n; i++) ng[i] = -1;
  for (int i = 1, u, V, va; i < n; i++) {
    scanf("%d%d%d", &u, &V, &va);
    r = max(r, va);
    v[u].push_back((ed){V, 0, 0, va});
    v[V].push_back((ed){u, 0, 0, va});
  }
  while (l != r) {
    int mid = (l + r + 1) / 2;
    if (jud(mid))
      l = mid;
    else
      r = mid - 1;
  }
  jud(l);
  printf("%d %d", ans1, ans2);
  return 0;
}
