Problem: You are given an integer k and a tree T with n nodes (n is even).

Let dist(u, v) be the number of edges on the shortest path from node u to node v in T.

Let us define a undirected weighted complete graph G = (V, E) as following: 

  * V = \\{x ∣ 1 ≤ x ≤ n \} i.e. the set of integers from 1 to n
  * E = \{(u, v, w) ∣ 1 ≤ u, v ≤ n, u ≠ v, w = dist(u, v) \} i.e. there is an edge between every pair of distinct nodes, the weight being the distance between their respective nodes in T 



Your task is simple, find a perfect matching in G with total edge weight k (1 ≤ k ≤ n^2).

Input

The first line of input contains two integers n, k (2 ≤ n ≤ 100 000, n is even, 1 ≤ k ≤ n^2): number of nodes and the total edge weight of the perfect matching you need to find.

The i-th of the following n - 1 lines contains two integers v_i, u_i (1 ≤ v_i, u_i ≤ n) denoting an edge between v_i and u_i in T. It is guaranteed that the given graph is a tree. 

Output

If there are no matchings that satisfy the above condition, output "NO" (without quotes) on a single line. 

Otherwise, you should output "YES" (without quotes) on the first line of output.

You should then output n/2 lines, the i-th line containing p_i, q_i (1 ≤ p_i, q_i ≤ n): the i-th pair of the matching.

Examples

Input


4 2
1 2
2 3
3 4


Output


YES
2 1
3 4


Input


4 4
1 2
2 3
3 4


Output


YES
3 1
2 4

Note

A tree is a connected acyclic undirected graph.

A matching is set of pairwise non-adjacent edges, none of which are loops; that is, no two edges share a common vertex. 

A perfect matching is a matching which matches all vertices of the graph; that is, every vertex of the graph is incident to exactly one edge of the matching.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
set<pair<int, int> > S[100005];
set<pair<int, int> >::iterator it;
priority_queue<pair<int, int> > Q;
pair<int, int> ans[100005];
int n, r, cnt;
int tar[100005 << 1], nex[100005 << 1], fir[100005], tot;
int siz[100005], val[100005], fat[100005], dep[100005];
long long m;
void Add(int a, int b) {
  tot++;
  tar[tot] = b;
  nex[tot] = fir[a];
  fir[a] = tot;
}
void Dfs(int k, int fa) {
  siz[k] = 1;
  val[k] = 0;
  for (int i = fir[k]; i; i = nex[i]) {
    int v = tar[i];
    if (v != fa) {
      Dfs(v, k);
      siz[k] += siz[v];
      val[k] = max(val[k], siz[v]);
    }
  }
  val[k] = max(val[k], n - siz[k]);
  if (val[k] <= n / 2) r = k;
}
void Dfs(int k, int fa, int s, int x) {
  fat[k] = fa;
  dep[k] = s;
  m -= s;
  S[x].insert(make_pair(s, k));
  siz[k] = 1;
  for (int i = fir[k]; i; i = nex[i]) {
    int v = tar[i];
    if (v != fa) {
      Dfs(v, k, s + 1, x);
      siz[k] += siz[v];
    }
  }
}
int main() {
  scanf("%d%lld", &n, &m);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    Add(x, y), Add(y, x);
  }
  Dfs(1, 0);
  for (int i = fir[r]; i; i = nex[i]) {
    int v = tar[i];
    Dfs(v, r, 1, v);
    Q.push(make_pair(siz[v], v));
  }
  if (m > 0 || (m & 1)) {
    puts("NO");
    return 0;
  }
  m /= -2;
  while (m) {
    int x = Q.top().second;
    Q.pop();
    if (siz[x] < 2) {
      printf("NO");
      return 0;
    }
    siz[x] -= 2;
    if (siz[x]) Q.push(make_pair(siz[x], x));
    if ((*--S[x].end()).first - 1 <= m) {
      int y = (*--S[x].end()).second;
      S[x].erase(--S[x].end());
      m -= dep[y] - 1;
      int z = fat[y];
      bool flg = 0;
      for (int i = fir[z]; i; i = nex[i]) {
        int v = tar[i];
        if ((v != fat[z]) && (v != y) &&
            (S[x].find(make_pair(dep[v], v)) != S[x].end())) {
          ans[++cnt] = make_pair(v, y);
          S[x].erase(make_pair(dep[v], v));
          flg = 1;
          break;
        }
      }
      if (!flg) {
        ans[++cnt] = make_pair(z, y);
        S[x].erase(make_pair(dep[z], z));
      }
    } else {
      it = lower_bound(S[x].begin(), S[x].end(), make_pair((int)m, 0));
      while (it->first == m) {
        bool flg = 0;
        int y = it->second;
        for (int i = fir[y]; i; i = nex[i]) {
          int v = tar[i];
          if ((v != fat[y]) &&
              (S[x].find(make_pair(dep[v], v)) != S[x].end())) {
            ans[++cnt] = make_pair(y, v);
            S[x].erase(make_pair(dep[y], y));
            S[x].erase(make_pair(dep[v], v));
            flg = 1;
            break;
          }
        }
        if (flg) break;
        it++;
      }
      m = 0;
    }
  }
  while (!Q.empty()) {
    int x = Q.top().second;
    Q.pop();
    if (Q.empty()) {
      ans[++cnt] = make_pair((*S[x].begin()).second, r);
      break;
    }
    int y = Q.top().second;
    Q.pop();
    if (siz[x] > 1) Q.push(make_pair(--siz[x], x));
    if (siz[y] > 1) Q.push(make_pair(--siz[y], y));
    ans[++cnt] = make_pair((*S[x].begin()).second, (*S[y].begin()).second);
    S[x].erase(S[x].begin());
    S[y].erase(S[y].begin());
  }
  puts("YES");
  for (int i = 1; i <= cnt; i++) printf("%d %d\n", ans[i].first, ans[i].second);
}