#include <bits/stdc++.h>
using namespace std;
const double pi = acos(0.0) * 2.0;
const double eps = 1e-12;
const int step[8][2] = {{1, 0}, {-1, 0}, {0, 1},  {0, -1},
                        {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
template <class T>
inline T abs1(T a) {
  return a < 0 ? -a : a;
}
template <class T>
inline T max1(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T max1(T a, T b, T c) {
  return max1(max1(a, b), c);
}
template <class T>
inline T max1(T a, T b, T c, T d) {
  return max1(max1(a, b, c), d);
}
template <class T>
inline T max1(T a, T b, T c, T d, T e) {
  return max1(max1(a, b, c, d), e);
}
template <class T>
inline T min1(T a, T b) {
  return a < b ? a : b;
}
template <class T>
inline T min1(T a, T b, T c) {
  return min1(min1(a, b), c);
}
template <class T>
inline T min1(T a, T b, T c, T d) {
  return min1(min1(a, b, c), d);
}
template <class T>
inline T min1(T a, T b, T c, T d, T e) {
  return min1(min1(a, b, c, d), e);
}
inline int jud(double a, double b) {
  if (abs(a) < eps && abs(b) < eps)
    return 0;
  else if (abs1(a - b) / abs1(a) < eps)
    return 0;
  if (a < b) return -1;
  return 1;
}
template <typename t>
inline int jud(t a, t b) {
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}
template <typename it, typename t1>
inline int find(t1 val, it a, int na, bool f_small = 1, bool f_lb = 1) {
  int be = 0, en = na - 1;
  if (*a <= *(a + na - 1)) {
    if (f_lb == 0)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != 1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != -1)
          en = mid;
        else
          be = mid + 1;
      }
    if (f_small && jud(*(a + be), val) == 1) be--;
    if (!f_small && jud(*(a + be), val) == -1) be++;
  } else {
    if (f_lb)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != -1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != 1)
          en = mid;
        else
          be = mid + 1;
      }
    if (!f_small && jud(*(a + be), val) == -1) be--;
    if (f_small && jud(*(a + be), val) == 1) be++;
  }
  return be;
}
template <class T>
inline T lowb(T num) {
  return num & (-num);
}
inline int bitnum(unsigned int nValue) { return __builtin_popcount(nValue); }
inline int bitnum(int nValue) { return __builtin_popcount(nValue); }
inline int bitnum(unsigned long long nValue) {
  return __builtin_popcount(nValue) + __builtin_popcount(nValue >> 32);
}
inline int bitnum(long long nValue) {
  return __builtin_popcount(nValue) + __builtin_popcount(nValue >> 32);
}
inline int bitmaxl(unsigned int a) {
  if (a == 0) return 0;
  return 32 - __builtin_clz(a);
}
inline int bitmaxl(int a) {
  if (a == 0) return 0;
  return 32 - __builtin_clz(a);
}
inline int bitmaxl(unsigned long long a) {
  int temp = a >> 32;
  if (temp) return 32 - __builtin_clz(temp) + 32;
  return bitmaxl(int(a));
}
inline int bitmaxl(long long a) {
  int temp = a >> 32;
  if (temp) return 32 - __builtin_clz(temp) + 32;
  return bitmaxl(int(a));
}
long long pow(long long n, long long m, long long mod = 0) {
  if (m < 0) return 0;
  long long ans = 1;
  long long k = n;
  while (m) {
    if (m & 1) {
      ans *= k;
      if (mod) ans %= mod;
    }
    k *= k;
    if (mod) k %= mod;
    m >>= 1;
  }
  return ans;
}
const int maxn = 100100;
long long cnt[maxn];
long long sum[maxn], sum1[maxn];
struct edge {
  int to, nxt;
} e[maxn * 2];
int head[maxn], le;
long long n, nw, nc, have, rnw, rnc;
void addedge(int a, int b) {
  e[le].to = b;
  e[le].nxt = head[a];
  head[a] = le++;
}
void dfs(int fa, int no, int deep) {
  cnt[deep]++;
  for (int i = head[no]; i != -1; i = e[i].nxt)
    if (e[i].to != fa) {
      dfs(no, e[i].to, deep + 1);
    }
}
inline long long get(int be, int en) {
  if (be > en) return 0;
  if (be == 0) return sum[en];
  return sum[en] - sum[be - 1];
}
inline long long get1(int be, int en) {
  if (be > en) return 0;
  if (be == 0) return sum1[en];
  return sum1[en] - sum1[be - 1];
}
inline long long getans(int be, int en) {
  return get1(be, en) - (n - en) * get(be, en);
}
int main() {
  ios_base::sync_with_stdio(0);
  scanf("%I64d%I64d%I64d", &n, &nw, &nc);
  rnw = nw;
  rnc = nc;
  memset(head, -1, sizeof(head));
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    addedge(a, b);
    addedge(b, a);
  }
  dfs(-1, 0, 0);
  sum[0] = cnt[0];
  sum1[0] = n * cnt[0];
  for (int i = 1; i <= n; i++) {
    sum[i] = sum[i - 1] + cnt[i];
    sum1[i] = sum1[i - 1] + cnt[i] * (n - i);
  }
  long long l = n;
  while (nc >= 0 && l) {
    nc -= cnt[l] * (n - l);
    nw -= cnt[l];
    l--;
  }
  l++;
  nc += cnt[l] * (n - l);
  nw += cnt[l];
  int have = min(nc / (n - l), cnt[l]);
  nc -= have * (n - l);
  nw -= have;
  long long ans = min(rnw, cnt[1]);
  for (int r = n; r > 1; r--) {
    nc = rnc - getans(l + 1, r);
    nw = rnw - get(l + 1, r);
    while (nc >= 0 && l) {
      nc -= cnt[l] * (r - l);
      nw -= cnt[l];
      l--;
    }
    l++;
    nc += cnt[l] * (r - l);
    nw += cnt[l];
    int have = min(nc / (r - l), cnt[l]);
    nc -= have * (r - l);
    nw -= have;
    ans = max(ans, rnw - nw);
  }
  cout << min(rnw, ans) << endl;
  return 0;
}
