#include <bits/stdc++.h>
using namespace std;
inline void Fail() {
  printf("0");
  exit(0);
}
const int maxn = 100005;
int n, l, r, mn, id, ans, from, to, cnt, clen, mxdep, mid;
vector<pair<int, int> > edge[maxn];
pair<int, pair<int, int> > cur[maxn];
vector<int> beauty;
int sz[maxn], u[maxn], v[maxn], c[maxn], cen[maxn][25], total[maxn][25];
bool centroid[maxn], debug;
class segtree {
 public:
  pair<int, int> tree[maxn * 4];
  int sz;
  void _init(int tot) {
    for (sz = 1; sz < tot; sz <<= 1)
      ;
    for (int(i) = 0; (i) < sz << 1; i++) tree[i] = make_pair(-1e9, -1);
  }
  void upd(int pos, int val, int id) {
    pos += sz - 1;
    tree[pos] = max(tree[pos], make_pair(val, id));
    while (pos) {
      pos >>= 1;
      if (!pos) break;
      tree[pos] = max(tree[pos << 1], tree[pos << 1 | 1]);
    }
  }
  void clr(int pos) {
    pos += sz - 1;
    tree[pos] = make_pair(-1e9, -1);
    while (pos) {
      pos >>= 1;
      if (!pos) break;
      tree[pos] = max(tree[pos << 1], tree[pos << 1 | 1]);
    }
  }
  pair<int, int> qry(int l, int r) {
    if (r < 1) return make_pair(-1e9, -1);
    l = max(l, 1);
    r = min(r, sz);
    l += sz - 1;
    r += sz - 1;
    pair<int, int> res = make_pair(-1e9, -1);
    for (; l <= r; l >>= 1, r >>= 1) {
      if (l & 1) res = max(res, tree[l++]);
      if ((r - 1) & 1) res = max(res, tree[r--]);
    }
    return res;
  }
} T;
void get_sz(int x, int p) {
  sz[x] = 1;
  for (int(i) = 0; (i) < edge[x].size(); i++) {
    pair<int, int> y = edge[x][i];
    if (centroid[y.first] || y.first == p) continue;
    get_sz(y.first, x);
    sz[x] += sz[y.first];
  }
}
void get_centroid(int x, int p, int tot) {
  int mx = tot - sz[x];
  for (int(i) = 0; (i) < edge[x].size(); i++) {
    pair<int, int> y = edge[x][i];
    if (centroid[y.first] || y.first == p) continue;
    get_centroid(y.first, x, tot);
    mx = max(mx, sz[y.first]);
  }
  if (mx < mn) {
    mn = mx;
    id = x;
  }
}
void get_dis(int x, int p, int dep, int dis, int s) {
  mxdep = max(mxdep, dep);
  cur[clen++] = make_pair(dep, make_pair(dis, x));
  pair<int, int> mx = T.qry(l - dep + 1, r - dep + 1);
  if (dis + mx.first > ans) {
    ans = dis + mx.first;
    from = x;
    to = mx.second;
  }
  for (int(i) = 0; (i) < edge[x].size(); i++) {
    pair<int, int> y = edge[x][i];
    if (centroid[y.first] || y.first == p) continue;
    get_dis(y.first, x, dep + 1, dis + (y.second >= mid ? 1 : -1), s);
  }
}
void solve(int t, int dep) {
  int s = cen[t][dep];
  if (s < 0) {
    mn = 1e9;
    get_sz(t, -1);
    get_centroid(t, -1, sz[t]);
    s = id;
    cen[t][dep] = s;
    total[t][dep] = sz[t];
  }
  centroid[s] = true;
  T._init(total[t][dep] + 1);
  T.upd(1, 0, s);
  for (int(i) = 0; (i) < edge[s].size(); i++) {
    if (centroid[edge[s][i].first]) continue;
    clen = 0;
    get_dis(edge[s][i].first, s, 1, edge[s][i].second >= mid ? 1 : -1, s);
    for (int(j) = 0; (j) < clen; j++) {
      T.upd(cur[j].first + 1, cur[j].second.first, cur[j].second.second);
    }
  }
  for (int(i) = 0; (i) < edge[s].size(); i++)
    if (!centroid[edge[s][i].first]) solve(edge[s][i].first, dep + 1);
  centroid[s] = false;
}
void add_edge(int x, int y, int z) {
  edge[x].push_back(make_pair(y, z));
  edge[y].push_back(make_pair(x, z));
}
bool check() {
  ans = -1e9;
  solve(0, 0);
  return ans >= 0;
}
int main() {
  memset(cen, -1, sizeof(cen));
  scanf("%d%d%d", &n, &l, &r);
  for (int(i) = 0; (i) < n - 1; i++) {
    scanf("%d%d%d", &u[i], &v[i], &c[i]);
    u[i]--, v[i]--;
    add_edge(u[i], v[i], c[i]);
    beauty.push_back(c[i]);
  }
  sort(beauty.begin(), beauty.end());
  beauty.resize(unique(beauty.begin(), beauty.end()) - beauty.begin());
  int L = 0, R = beauty.size();
  while (R - L > 1) {
    int Mid = (L + R) >> 1;
    mid = beauty[Mid];
    if (check())
      L = Mid;
    else
      R = Mid;
  }
  debug = true;
  mid = beauty[L];
  check();
  printf("%d %d", from + 1, to + 1);
  return 0;
}
