#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const double PI = acos(-1.0);
const int MAXN = 1e6 + 5;
const int MAXM = 3e6 + 5;
const int MOD = 1e9 + 7;
int sgn(double x) {
  if (fabs(x) < eps) return 0;
  if (x < 0)
    return -1;
  else
    return 1;
}
long long pw(long long a, long long n, long long mod) {
  long long ret = 1;
  while (n) {
    if (n & 1) ret = ret * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return ret;
}
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
void inc(long long &a, long long b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
void dec(long long &a, long long b) {
  a -= b;
  if (a < 0) a += MOD;
}
int mul(int a, int b) {
  long long c = 1ll * a * b;
  return c - c / MOD * MOD;
}
int n;
long long k, v[MAXN];
vector<int> G[MAXN];
void dfs(int x) {
  for (auto y : G[x]) v[y] ^= v[x], dfs(y);
}
int cnt, now[MAXN], to[MAXN], sz[MAXM], ch[MAXM][2];
int getid(int x, int y) { return ch[x][y] ? ch[x][y] : ch[x][y] = ++cnt; }
void work() {
  for (int i = 1; i < n + 1; i++) now[i] = to[i] = 1;
  long long sum0, ans = 0;
  for (int j = 61; j != -1; j--) {
    for (int i = 1; i < cnt + 1; i++) ch[i][0] = ch[i][1] = sz[i] = 0;
    cnt = 0;
    for (int i = 1; i < n + 1; i++) sz[now[i] = getid(now[i], v[i] >> j & 1)]++;
    sum0 = 0;
    for (int i = 1; i < n + 1; i++) sum0 += sz[ch[to[i]][v[i] >> j & 1]];
    int t = 0;
    if (sum0 < k) {
      k -= sum0;
      ans |= 1ll << j;
      t = 1;
    }
    for (int i = 1; i < n + 1; i++) to[i] = ch[to[i]][(v[i] >> j & 1) ^ t];
  }
  printf("%lld\n", ans);
}
int main() {
  scanf("%d%lld", &n, &k);
  int p;
  for (int i = 2; i < n + 1; i++) scanf("%d%lld", &p, &v[i]), G[p].push_back(i);
  dfs(1);
  work();
}
