评测寄录
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
int h[214514],e[414514],ne[414514],idx;
ll st[214514],w[214514],g[214514][3];
ll f[214514][114],mod=1e9+7,ans;
ll op[214514],cnt=1e18;
inline void add(int a,int b,int c)
{
idx++;
ne[idx]=h[a];
e[idx]=b;
w[idx]=c;
h[a]=idx;
}
inline void dfs(int x)
{
st[x]=1;
int ff=0,op,res=1;
for(int i=h[x];i;i=ne[i])
{
int y=e[i];
if(!st[y])
{
dfs(y);
ll aa=1e18,aaa=0;
ll bb=1e18;
if(w[i]==0)
{
for(int j=1;j<=k;j++)
{
if(aa>g[y][j])
{
bb=aa;
aa=g[y][j];
aaa=j;
}
else if(bb>g[y][j])
bb=g[y][j];
}
for(int j=1;j<=k;j++)
{
if(j!=aaa)
g[x][j]+=aa;
else
g[x][j]+=bb;
}
}
else if(w[i]==1)
{
for(int j=1;j<=k;j++)
aa=min(aa,g[y][j]);
for(int j=1;j<=k;j++)
g[x][j]+=aa;
}
else
{
for(int j=1;j<=k;j++)
g[x][j]+=g[y][j];
}
ff++;
ll res=0;
for(int j=1;j<=k;j++)
res+=f[y][j];
res%=mod;
if(w[i]==0)
{
for(int j=1;j<=k;j++)
f[x][j]=f[x][j]*((res-f[y][j]+mod)%mod)%mod;
}
else if(w[i]==1)
{
for(int j=1;j<=k;j++)
f[x][j]=f[x][j]*res%mod;
}
else
{
for(int j=1;j<=k;j++)
f[x][j]=f[x][j]*f[y][j]%mod;
}
}
}
for(int i=1;i<=k;i++)
g[x][i]+=i;
}
int main()
{
//memset(g,0x3f,sizeof g);
cin>>n>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
f[i][j]=1;
for(int i=1;i<=n-1;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dfs(1);
for(int i=1;i<=k;i++)
ans=(ans+f[1][i])%mod;
/*for(int i=1;i<=n;i++)
cout<<i<<' '<<op[i]<<'\n';
cout<<endl;*/
ans%=mod;
if(ans==0)
{
cout<<0<<' '<<0;
return 0;
}
cnt=1e18;
for(int i=1;i<=k;i++)
cnt=min(cnt,g[1][i]);
cout<<ans<<' '<<cnt;
return 0;
}