http://codeforces.com/problemset/problem/161/D
//dp[i][j]表示以i节点为端点 且 长度为j的种数
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n,k;
const int maxn=50006;
typedef long long lld;
int dp[maxn][505];
lld ans;
vector<int>edge[maxn];
void DFS(int u,int f)
{
int i,j,v;
int sz=edge[u].size();
dp[u][0]++;
for(i=0;i<sz;i++)
{
v=edge[u][i];
if(f==v)continue;
DFS(v,u);
for(j=0;j<k;j++)
ans+=(lld)dp[v][j]*dp[u][k-j-1];//计算长度为k的种数
for(j=0;j<=k;j++)
dp[u][j+1]+=dp[v][j];//转移
}
}
int main()
{
int i,j;
int u,v;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(i=0;i<=n;i++)
edge[i].clear();
memset(dp,0,sizeof(dp));
for(i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
ans=0;
DFS(1,1);
printf("%lld\n",ans);
}
return 0;
}