#include <bits/stdc++.h>
using namespace std;
int n, l, r;
vector<pair<int, int> > G[100005];
int seq[100005], cnts, siz[100005], rch[100005], num[100005];
bool vis[100005];
int rt, Min;
void dfs(int now, int ff, int tsz) {
  int Max = 0;
  siz[now] = 1;
  rch[now] = 0;
  for (int i = 0, v, sz = G[now].size(); i < sz; i++)
    if ((v = G[now][i].first) != ff && !vis[v]) {
      dfs(v, now, tsz);
      rch[now] = max(rch[now], rch[v] + 1);
      siz[now] += siz[v];
      Max = max(Max, siz[v]);
    }
  Max = max(Max, tsz - siz[now]);
  if (Max < Min) Min = Max, rt = now;
}
int Gert(int now, int tsz) {
  Min = 0x3f3f3f3f;
  dfs(now, -1, tsz);
  return rt;
}
bool cmp(const pair<int, int> &a, const pair<int, int> &b) {
  return rch[a.first] < rch[b.first];
}
void setsiz(int now, int ff) {
  siz[now] = 1, rch[now] = 0;
  for (int i = 0, sz = G[now].size(), v; i < sz; i++)
    if ((v = G[now][i].first) != ff && !vis[v]) {
      setsiz(v, now);
      siz[now] += siz[v];
      rch[now] = max(rch[now], rch[v] + 1);
    }
}
void Solve(int now) {
  seq[++cnts] = now;
  setsiz(now, -1);
  vis[now] = 1;
  rch[now] = 0;
  sort(G[now].begin(), G[now].end(), cmp);
  for (int v, i = 0, sz = G[now].size(); i < sz; i++)
    if (!vis[(v = G[now][i].first)]) Solve(Gert(v, siz[v]));
}
int f[100005], g[100005], floc[100005], gloc[100005], ansx, ansy;
int Maxdep;
void ser(int now, int ff, int dist, int cost, int Lim) {
  Maxdep = max(Maxdep, dist);
  if (cost > g[dist]) g[dist] = cost, gloc[dist] = now;
  for (int i = 0, sz = G[now].size(), v; i < sz; i++)
    if ((v = G[now][i].first) != ff && !vis[v])
      ser(v, now, dist + 1, cost + (G[now][i].second >= Lim ? 1 : -1), Lim);
}
int Q[100005], L, R;
bool check(int Lim) {
  memset(vis, 0, sizeof vis);
  memset(f, -0x3f, sizeof f);
  memset(g, -0x3f, sizeof g);
  f[0] = 0;
  int premaxdep = 0;
  for (int u, id = 1; id <= n; id++) {
    for (int i = 1; i <= premaxdep; i++) f[i] = -0x3f3f3f3f, g[i] = -0x3f3f3f3f;
    premaxdep = 0;
    vis[u = seq[id]] = 1;
    floc[0] = u;
    for (int predep = 0, i = 0, v, sz = G[u].size(); i < sz; i++)
      if (!vis[v = G[u][i].first]) {
        for (int j = 1; j <= predep; j++) g[j] = -0x3f3f3f3f;
        Maxdep = 0;
        ser(v, -1, 1, G[u][i].second >= Lim ? 1 : -1, Lim);
        L = R = 0;
        for (int j = 0, k = min(r, Maxdep); j <= predep; j++) {
          for (; j + k >= l && k >= 0; k--) {
            for (; L < R && g[k] >= g[Q[R - 1]]; R--)
              ;
            Q[R++] = k;
          }
          for (; L < R && Q[L] + j > r; L++)
            ;
          if (L < R && f[j] + g[Q[L]] >= 0) {
            ansx = floc[j];
            ansy = gloc[Q[L]];
            return 1;
          }
        }
        for (int j = 1; j <= Maxdep; j++)
          if (f[j] < g[j]) f[j] = g[j], floc[j] = gloc[j];
        predep = Maxdep;
        premaxdep = max(premaxdep, Maxdep);
      }
  }
  return 0;
}
int main() {
  int u, v, w;
  scanf("%d%d%d", &n, &l, &r);
  for (int i = 1; i < n; i++) {
    scanf("%d%d%d", &u, &v, &w);
    G[u].push_back(make_pair(v, w));
    G[v].push_back(make_pair(u, w));
  }
  Solve(Gert(1, n));
  int L = 0, R = 1000000000, Mid;
  while (L < R) {
    Mid = (L + R + 1) >> 1;
    if (check(Mid))
      L = Mid;
    else
      R = Mid - 1;
  }
  check(L);
  printf("%d %d\n", ansx, ansy);
}
