Someone give a strange birthday present to Ivan. It is hedgehog — connected undirected graph in which one vertex has degree at least 3 (we will call it center) and all other vertices has degree 1. Ivan thought that hedgehog is too boring and decided to make himself k-multihedgehog.

Let us define k-multihedgehog as follows:

  * 1-multihedgehog is hedgehog: it has one vertex of degree at least 3 and some vertices of degree 1.
  * For all k ≥ 2, k-multihedgehog is (k-1)-multihedgehog in which the following changes has been made for each vertex v with degree 1: let u be its only neighbor; remove vertex v, create a new hedgehog with center at vertex w and connect vertices u and w with an edge. New hedgehogs can differ from each other and the initial gift. 



Thereby k-multihedgehog is a tree. Ivan made k-multihedgehog but he is not sure that he did not make any mistakes. That is why he asked you to check if his tree is indeed k-multihedgehog.

Input

First line of input contains 2 integers n, k (1 ≤ n ≤ 10^{5}, 1 ≤ k ≤ 10^{9}) — number of vertices and hedgehog parameter.

Next n-1 lines contains two integers u v (1 ≤ u,    v ≤ n;    u ≠ v) — indices of vertices connected by edge.

It is guaranteed that given graph is a tree.

Output

Print "Yes" (without quotes), if given graph is k-multihedgehog, and "No" (without quotes) otherwise.

Examples

Input

14 2
1 4
2 4
3 4
4 13
10 5
11 5
12 5
14 5
5 13
6 7
8 6
13 6
9 6


Output

Yes


Input

3 1
1 3
2 3


Output

No

Note

2-multihedgehog from the first example looks like this:

<image>

Its center is vertex 13. Hedgehogs created on last step are: [4 (center), 1, 2, 3], [6 (center), 7, 8, 9], [5 (center), 10, 11, 12, 13].

Tree from second example is not a hedgehog because degree of center should be at least 3.
import java.lang.*;
import java.util.*;
import java.io.*;

public class CF1067B {
	public static void getDistances(int v, int p, int cLevel, int[] dist, int[] par, ArrayList<ArrayList<Integer>> tree) {
//		System.out.printf("gd %d %d %d\n", v, cLevel, p);
//		if (p == -1) System.out.printf("ROOT CALL\n");
		dist[v] = cLevel;
		par[v] = p;
		for (int k = 0; k < tree.get(v).size(); ++k) {
			int nxt = tree.get(v).get(k);
			if (nxt == p) continue;
			getDistances(nxt, v, cLevel + 1, dist, par, tree);
		}
	}
	public static ArrayList<Integer> getDiameter (ArrayList<ArrayList<Integer>> tree) {
		int n = tree.size();
		ArrayList<Integer> ans = new ArrayList<Integer>();
		int[] dist = new int[n], par = new int[n];
		getDistances(0, -1, 0, dist, par, tree);
		int secondSearch = 0;
		for (int i = 1; i < n; ++i) {
			if (dist[i] > dist[secondSearch]) secondSearch = i;
		}
		getDistances(secondSearch, -1, 0, dist, par, tree);
		int thirdSearch = 0;
		for (int i = 1; i < n; ++i) {
			if (dist[i] > dist[thirdSearch]) thirdSearch = i;
		}
		for (int i = thirdSearch; i != secondSearch; i = par[i]) {
			ans.add(i);
		}
		ans.add(secondSearch);
		return ans;
	}
	public static void main(String[] args) throws IOException {
		Reader.init(System.in);
		int n = Reader.nextInt(), k = Reader.nextInt();
		ArrayList<ArrayList<Integer>> tree = new ArrayList<ArrayList<Integer>>(n);
		for (int i = 0; i < n; ++i) tree.add(new ArrayList<Integer>());
		for (int i = 0; i < n - 1; ++i) {
			int u = Reader.nextInt(), v = Reader.nextInt();
			--u; --v;
			tree.get(u).add(v);
			tree.get(v).add(u);
		}
		if (k > 69696969) {
			System.out.printf("No\n");
			return;
		}
		ArrayList<Integer> x = getDiameter(tree);	
		if (x.size() != k * 2 + 1) {
			System.out.printf("No\n");
			return;
		}
		int center = x.get(k);
		int[] dist = new int[n], par = new int[n];
		getDistances(center, -1, 0, dist, par, tree);
		// verify that root has degree >= 3, leaves are at dist k, all other vertices have degree >= 4
		boolean isValid = true;
		for (int i = 0; i < n; ++i) {
			if (i == center) {
				if (tree.get(i).size() < 3) isValid = false;
			} else if (tree.get(i).size() == 1) {
				if (dist[i] != k) isValid = false;
			} else {
				if (tree.get(i).size() < 4) isValid = false;
			}
		}
		if (isValid) System.out.printf("Yes\n");
		else System.out.printf("No\n");
		return;
	}
};

class Reader {
	static BufferedReader reader;
	static StringTokenizer tokenizer;

	/** call this method to initialize reader for InputStream */
	static void init(InputStream input) {
		reader = new BufferedReader(
					new InputStreamReader(input) );
		tokenizer = new StringTokenizer("");
	}

	/** get next word */
	static String next() throws IOException {
		while ( ! tokenizer.hasMoreTokens() ) {
			//TODO add check for eof if necessary
			tokenizer = new StringTokenizer(
				reader.readLine() );
		}
		return tokenizer.nextToken();
	}

	static int nextInt() throws IOException {
		return Integer.parseInt( next() );
	}
	static long nextLong() throws IOException {
		return Long.parseLong( next() );
	}
	static double nextDouble() throws IOException {
		return Double.parseDouble( next() );
	}
}

