#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define inf 0x3f3f3f3f
const double pi=3.1415926;
using namespace std;
vector<int>a[100086];
int t,n,k;
int dfs(int x,int last)///当前点,父节点
{
int res=1;///自己是一个节点,看看有没有没有剪掉的子节点贡献给自己顺便返回给父亲
for(int i=0;i<a[x].size();i++)
{
int next=a[x][i];
if(next==last)///无向图存两边防止死循环
continue;
int num=dfs(next,x);///子树的节点树
if(num==-1)
return -1;
if(num==k) ///不断dfs,只要形成k节点的子树就可以剪掉,不累加计数
continue;
if(num>k)///
return -1;
res+=num;
}
return res;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
a[i].clear();
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
}
int ans=dfs(1,1);
if(ans==k)
printf("YES
");
else
printf("NO
");
}
return 0;
}