#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e9 + 7;
const int N = 1e5 + 7;
const int MOD = 1e9 + 7;
const double Pi = acos(-1.);
const double EPS = 1e-8;
int n, L, R, vis[N], pre[N], siz[N], mss[N], que[N], dis[N], sum[N], cur[N][2],
    all[N][2];
int et, head[N], ans[3];
struct Edge {
  int s, t, w, next;
} e[N << 1];
void addEdge(int s, int t, int w) {
  e[et].s = s, e[et].t = t, e[et].w = w, e[et].next = head[s], head[s] = et++;
  e[et].s = t, e[et].t = s, e[et].w = w, e[et].next = head[t], head[t] = et++;
}
int getroot(int u) {
  int h = 0, t = 1;
  que[h] = u, vis[u] = true;
  while (h < t) {
    int x = que[h++];
    for (int i = head[x]; ~i; i = e[i].next) {
      int y = e[i].t;
      if (vis[y]) continue;
      vis[y] = true;
      pre[y] = x;
      que[t++] = y;
    }
  }
  for (int i = 0; i < t; ++i) {
    siz[que[i]] = 1;
    vis[que[i]] = mss[que[i]] = 0;
  }
  for (int i = t - 1; i >= 0; --i) {
    int x = que[i];
    siz[pre[x]] += siz[x];
    mss[pre[x]] = max(mss[pre[x]], siz[x]);
  }
  if (siz[u] <= L) return -1;
  int ret = -1;
  for (int i = 0; i < t; ++i) {
    u = que[i];
    mss[u] = max(mss[u], t - siz[u]);
    if (ret == -1 || mss[u] < mss[ret]) ret = u;
  }
  return ret;
}
bool check(int mid, int u) {
  int mad = 0;
  for (int i = head[u]; ~i; i = e[i].next) {
    int v = e[i].t;
    if (vis[v]) continue;
    int h = 0, t = 1;
    que[h] = v, dis[v] = 1, vis[v] = true, sum[v] = (e[i].w >= mid ? 1 : -1);
    while (h < t) {
      int x = que[h++];
      for (int j = head[x]; ~j; j = e[j].next) {
        int y = e[j].t;
        if (vis[y]) continue;
        vis[y] = true;
        dis[y] = 1 + dis[x];
        sum[y] = sum[x] + (e[j].w >= mid ? 1 : -1);
        que[t++] = y;
      }
    }
    int mvd = 0;
    for (int j = 0; j < t; ++j) {
      int x = que[j];
      vis[x] = false;
      if (dis[x] > mvd) {
        mvd = dis[x];
        cur[mvd][0] = sum[x];
        cur[mvd][1] = x;
      } else if (cur[dis[x]][0] < sum[x]) {
        cur[dis[x]][0] = sum[x];
        cur[dis[x]][1] = x;
      }
    }
    int pre = 1;
    h = 0, t = 0;
    for (int j = min(L, mvd); j > 0; --j) {
      for (; pre <= mad && pre + j <= R; ++pre) {
        while (h < t && all[que[t - 1]][0] <= all[pre][0]) --t;
        que[t++] = pre;
      }
      while (h < t && que[h] + j < L) ++h;
      if (h == t) continue;
      if (all[que[h]][0] + cur[j][0] >= 0) {
        if (ans[0] < mid) {
          ans[0] = mid, ans[1] = cur[j][1], ans[2] = all[que[h]][1];
        }
        return true;
      }
    }
    for (int j = 1; j <= mvd; ++j)
      if (j > mad) {
        mad = j;
        all[j][0] = cur[j][0];
        all[j][1] = cur[j][1];
      } else if (all[j][0] < cur[j][0]) {
        all[j][0] = cur[j][0];
        all[j][1] = cur[j][1];
      }
  }
  for (int i = L; i <= min(mad, R); ++i)
    if (all[i][0] >= 0) {
      if (ans[0] < mid) {
        ans[0] = mid, ans[1] = u, ans[2] = all[i][1];
      }
      return true;
    }
  return false;
}
void solve(int u) {
  int v = getroot(u);
  if (v == -1) return;
  vis[v] = true;
  int l = 0, r = INF;
  while (l + 1 < r) {
    int m = (l + r) >> 1;
    check(m, v) ? l = m : r = m;
  }
  check(l, v), check(r, v);
  for (int i = head[v]; ~i; i = e[i].next)
    if (!vis[e[i].t]) {
      solve(e[i].t);
    }
}
int main() {
  scanf("%d%d%d", &n, &L, &R);
  memset(head, -1, sizeof(head));
  for (int i = 1; i < n; ++i) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    addEdge(u, v, w);
  }
  ans[0] = -1;
  solve(1);
  printf("%d %d", ans[1], ans[2]);
  return 0;
}
