#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, INF = N;
int n, L, R, ANS_U, ANS_V, ANS;
struct st {
  int nxt, to, w, dis;
} ed[N << 1];
int head[N], num;
void add(int from, int to, int w) {
  ed[++num].to = to, ed[num].w = w;
  ed[num].nxt = head[from];
  head[from] = num;
}
int sum, rt, siz[N], mx[N];
bool vis[N];
void getrt(int x, int fa) {
  mx[x] = 0;
  for (int u, i = head[x]; i; i = ed[i].nxt) {
    u = ed[i].to;
    if (u == fa || vis[u]) continue;
    getrt(u, x), mx[x] = max(mx[x], siz[u]);
  }
  mx[x] = max(mx[x], sum - siz[x]);
  if (mx[x] < mx[rt]) rt = x;
}
int mxd[N], V[N];
vector<int> E[N];
void dfs_init(int x, int fa) {
  mxd[x] = 0, siz[x] = 1;
  for (int u, i = head[x]; i; i = ed[i].nxt) {
    u = ed[i].to;
    if (vis[u] || u == fa) continue;
    dfs_init(u, x), mxd[x] = max(mxd[x], mxd[u] + 1), siz[x] += siz[u];
  }
}
bool cmp(int a, int b) { return mxd[a] < mxd[b]; }
void work(int x) {
  dfs_init(x, 0);
  int h = 0;
  for (int i = head[x]; i; i = ed[i].nxt)
    if (!vis[ed[i].to]) V[++h] = ed[i].to;
  sort(V + 1, V + 1 + h, cmp);
  for (int i = 1; i <= h; i++) E[x].push_back(V[i]);
}
void solve_init(int x) {
  work(x), vis[x] = 1;
  for (int u, i = head[x]; i; i = ed[i].nxt) {
    u = ed[i].to;
    if (vis[u]) continue;
    rt = 0, sum = siz[u], getrt(u, x), solve_init(rt);
  }
}
int f[N], a[N], s[N], id_a[N], id_s[N], ans_u, ans_v, ans;
void dfs(int x, int fa, int dep) {
  if (f[x] > a[dep]) a[dep] = f[x], id_a[dep] = x;
  for (int u, i = head[x]; i; i = ed[i].nxt) {
    u = ed[i].to;
    if (vis[u] || u == fa) continue;
    f[u] = f[x] + ed[i].dis, dfs(u, x, dep + 1);
  }
}
int q[N], hd, tail;
void calc(int x) {
  dfs_init(x, 0);
  int len = 0;
  for (int i = head[x]; i; i = ed[i].nxt)
    if (!vis[ed[i].to]) f[ed[i].to] = ed[i].dis, ++mxd[ed[i].to];
  for (int i = 0; i <= mxd[x]; i++) s[i] = -N;
  s[0] = 0, id_s[0] = x;
  for (auto u : E[x]) {
    if (vis[u]) continue;
    for (int i = 0; i <= mxd[u]; i++) a[i] = -N;
    a[0] = 0, id_a[0] = x;
    dfs(u, x, 1), hd = 1, tail = 0;
    if (L <= len)
      for (int i = min(R, len); i > L; i--) {
        while (hd <= tail && s[q[tail]] <= s[i]) --tail;
        q[++tail] = i;
      }
    for (int i = 0; i <= mxd[u]; i++) {
      while (hd <= tail && q[hd] > R - i) ++hd;
      if (len >= L - i && L - i >= 0) {
        while (hd <= tail && s[L - i] >= s[q[tail]]) --tail;
        q[++tail] = L - i;
      }
      if (hd <= tail && s[q[hd]] + a[i] > ans)
        ans = s[q[hd]] + a[i], ans_u = id_a[i], ans_v = id_s[q[hd]];
    }
    for (int i = 0; i <= mxd[u]; i++)
      if (a[i] > s[i]) s[i] = a[i], id_s[i] = id_a[i];
    len = max(len, mxd[u]);
  }
}
void solve(int x) {
  calc(x), vis[x] = 1;
  for (int u, i = head[x]; i; i = ed[i].nxt) {
    u = ed[i].to;
    if (vis[u]) continue;
    rt = 0, sum = siz[u], getrt(u, x), solve(rt);
  }
}
int main() {
  int u, v, w, l = 0, r = 0;
  scanf("%d%d%d", &n, &L, &R);
  for (int i = 1; i < n; i++)
    scanf("%d%d%d", &u, &v, &w), add(u, v, w), add(v, u, w), r = max(r, w);
  mx[0] = N, rt = 0, sum = n, getrt(1, 0), solve_init(rt);
  while (l <= r) {
    int mid = (l + r) >> 1;
    for (int i = 1; i <= num; i++) ed[i].dis = (ed[i].w >= mid) ? 1 : -1;
    for (int i = 1; i <= n; i++) vis[i] = 0;
    mx[0] = N, ans = -N, rt = 0, sum = n, getrt(1, 0), solve(rt);
    if (ans >= 0)
      ANS_U = ans_u, ANS_V = ans_v, ANS = mid, l = mid + 1;
    else
      r = mid - 1;
  }
  printf("%d %d\n", ANS_U, ANS_V);
  return 0;
}
