#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
const long long oo=1e18;
int mod=1e9+7;
int Test=1;
void home()
{
if(fopen("main.inp","r"))
freopen("main.inp","r",stdin),
freopen("main.out","w",stdout);
}
bool bit(int x,int i){return (x>>i)&1;}
int n;
vector<pair<int,int>>a[100005];
int Phi,sz[100005],del[100005],mu[100005],inv[100005];
int PhiHam(int n)
{
int res=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
while(n%i==0)
n/=i;
res-=res/i;
}
}
if(n!=1)res-=res/n;
return res;
}
int Pow(int a,int b)
{
int res=1;
for(;b;b>>=1)
{
if(b&1)res=(res*a)%mod;
a=(a*a)%mod;
}
return res;
}
int NghichDao(int n)
{
return Pow(n,Phi-1);
}
int Rev(int u)
{
u=((u*-1)%mod+mod)%mod;
return u;
}
void CalSz(int u,int par)
{
sz[u]=1;
for(auto [v,w]:a[u])
if(v!=par&&!del[v])CalSz(v,u),sz[u]+=sz[v];
}
int Centroid(int u,int par,int n)
{
for(auto [v,w]:a[u])
{
if(v!=par&&!del[v]&&sz[v]>n/2)
return Centroid(v,u,n);
}
return u;
}
int kq=0;
map<int,int>len,xuong;
void DFS(int u,int par,int pha,int DiXuong,int DiLen,int sau)
{
if(!pha)
{
kq+=len[Rev(DiXuong)*inv[sau]%mod];
kq+=xuong[DiLen];
}
else
{
len[DiLen]++;
xuong[Rev(DiXuong)*inv[sau]%mod]++;
}
for(auto [v,w]:a[u])if(v!=par&&!del[v])DFS(v,u,pha,(DiXuong*10+w)%mod,(w*mu[sau]+DiLen)%mod,sau+1);
}
void Decompose(int u)
{
CalSz(u,0);
u=Centroid(u,0,sz[u]);
len[0]=xuong[0]=1;
for(auto [v,w]:a[u])
{
if(!del[v])
{
DFS(v,u,0,w,w,1);
DFS(v,u,1,w,w,1);
}
}
del[u]=1;
len.clear();xuong.clear();
for(auto [v,w]:a[u])if(!del[v])Decompose(v);
}
void Tcmduc_VOI26()
{
cin>>n>>mod;mu[0]=1;Phi=PhiHam(mod);
inv[0]=NghichDao(1);
for(int i=1;i<=n;i++)
{
mu[i]=(mu[i-1]*10)%mod;
inv[i]=NghichDao(mu[i]);
}
for(int i=1;i<n;i++)
{
int u,v,w;cin>>u>>v>>w;u++,v++;w%=mod;
a[u].push_back({v,w});
a[v].push_back({u,w});
}
Decompose(1);
cout<<kq;
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);home();
while(Test--)Tcmduc_VOI26();
cerr<<'\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGxvbmcgbG9uZyBvbz0xZTE4OwppbnQgbW9kPTFlOSs3OwppbnQgVGVzdD0xOwp2b2lkIGhvbWUoKQp7CiAgICBpZihmb3BlbigibWFpbi5pbnAiLCJyIikpIAogICAgZnJlb3BlbigibWFpbi5pbnAiLCJyIixzdGRpbiksCiAgICBmcmVvcGVuKCJtYWluLm91dCIsInciLHN0ZG91dCk7Cn0KYm9vbCBiaXQoaW50IHgsaW50IGkpe3JldHVybiAoeD4+aSkmMTt9CmludCBuOwp2ZWN0b3I8cGFpcjxpbnQsaW50Pj5hWzEwMDAwNV07CmludCBQaGksc3pbMTAwMDA1XSxkZWxbMTAwMDA1XSxtdVsxMDAwMDVdLGludlsxMDAwMDVdOwppbnQgUGhpSGFtKGludCBuKSAKewogICAgaW50IHJlcz1uOwogICAgZm9yKGludCBpPTI7aSppPD1uO2krKykgCiAgICB7CiAgICAgICAgaWYobiVpPT0wKSAKICAgICAgICB7CiAgICAgICAgICAgIHdoaWxlKG4laT09MCkgCiAgICAgICAgICAgICAgICBuLz1pOwogICAgICAgICAgICByZXMtPXJlcy9pOwogICAgICAgIH0KICAgIH0KICAgIGlmKG4hPTEpcmVzLT1yZXMvbjsKICAgIHJldHVybiByZXM7Cn0KaW50IFBvdyhpbnQgYSxpbnQgYikKewogICAgaW50IHJlcz0xOwogICAgZm9yKDtiO2I+Pj0xKQogICAgewogICAgICAgIGlmKGImMSlyZXM9KHJlcyphKSVtb2Q7CiAgICAgICAgYT0oYSphKSVtb2Q7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CmludCBOZ2hpY2hEYW8oaW50IG4pCnsKICAgIHJldHVybiBQb3cobixQaGktMSk7Cn0KaW50IFJldihpbnQgdSkgCnsKICAgIHU9KCh1Ki0xKSVtb2QrbW9kKSVtb2Q7CiAgICByZXR1cm4gdTsKfQp2b2lkIENhbFN6KGludCB1LGludCBwYXIpCnsKICAgIHN6W3VdPTE7CiAgICBmb3IoYXV0byBbdix3XTphW3VdKQogICAgICAgIGlmKHYhPXBhciYmIWRlbFt2XSlDYWxTeih2LHUpLHN6W3VdKz1zelt2XTsKfQppbnQgQ2VudHJvaWQoaW50IHUsaW50IHBhcixpbnQgbikKewogICAgZm9yKGF1dG8gW3Ysd106YVt1XSkKICAgIHsKICAgICAgICBpZih2IT1wYXImJiFkZWxbdl0mJnN6W3ZdPm4vMikKICAgICAgICAgICAgcmV0dXJuIENlbnRyb2lkKHYsdSxuKTsKICAgIH0KICAgIHJldHVybiB1Owp9CmludCBrcT0wOwptYXA8aW50LGludD5sZW4seHVvbmc7CnZvaWQgREZTKGludCB1LGludCBwYXIsaW50IHBoYSxpbnQgRGlYdW9uZyxpbnQgRGlMZW4saW50IHNhdSkKewogICAgaWYoIXBoYSkKICAgIHsKICAgICAgICBrcSs9bGVuW1JldihEaVh1b25nKSppbnZbc2F1XSVtb2RdOwogICAgICAgIGtxKz14dW9uZ1tEaUxlbl07CiAgICB9IAogICAgZWxzZQogICAgewogICAgICAgIGxlbltEaUxlbl0rKzsKICAgICAgICB4dW9uZ1tSZXYoRGlYdW9uZykqaW52W3NhdV0lbW9kXSsrOwogICAgfQogICAgZm9yKGF1dG8gW3Ysd106YVt1XSlpZih2IT1wYXImJiFkZWxbdl0pREZTKHYsdSxwaGEsKERpWHVvbmcqMTArdyklbW9kLCh3Km11W3NhdV0rRGlMZW4pJW1vZCxzYXUrMSk7Cn0Kdm9pZCBEZWNvbXBvc2UoaW50IHUpCnsKICAgIENhbFN6KHUsMCk7CiAgICB1PUNlbnRyb2lkKHUsMCxzelt1XSk7CiAgICBsZW5bMF09eHVvbmdbMF09MTsKICAgIGZvcihhdXRvIFt2LHddOmFbdV0pCiAgICB7CiAgICAgICAgaWYoIWRlbFt2XSkKICAgICAgICB7CiAgICAgICAgICAgIERGUyh2LHUsMCx3LHcsMSk7CiAgICAgICAgICAgIERGUyh2LHUsMSx3LHcsMSk7CiAgICAgICAgfQogICAgfQogICAgZGVsW3VdPTE7CiAgICBsZW4uY2xlYXIoKTt4dW9uZy5jbGVhcigpOwogICAgZm9yKGF1dG8gW3Ysd106YVt1XSlpZighZGVsW3ZdKURlY29tcG9zZSh2KTsKfQp2b2lkIFRjbWR1Y19WT0kyNigpCnsKICAgIGNpbj4+bj4+bW9kO211WzBdPTE7UGhpPVBoaUhhbShtb2QpOwogICAgaW52WzBdPU5naGljaERhbygxKTsKICAgIGZvcihpbnQgaT0xO2k8PW47aSsrKQogICAgewogICAgICAgIG11W2ldPShtdVtpLTFdKjEwKSVtb2Q7CiAgICAgICAgaW52W2ldPU5naGljaERhbyhtdVtpXSk7CiAgICB9CiAgICBmb3IoaW50IGk9MTtpPG47aSsrKQogICAgewogICAgICAgIGludCB1LHYsdztjaW4+PnU+PnY+Pnc7dSsrLHYrKzt3JT1tb2Q7CiAgICAgICAgYVt1XS5wdXNoX2JhY2soe3Ysd30pOwogICAgICAgIGFbdl0ucHVzaF9iYWNrKHt1LHd9KTsKICAgIH0KICAgIERlY29tcG9zZSgxKTsKICAgIGNvdXQ8PGtxOwp9CnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApO2hvbWUoKTsKICAgIHdoaWxlKFRlc3QtLSlUY21kdWNfVk9JMjYoKTsKICAgIGNlcnI8PCdcbic7CiAgICByZXR1cm4gMDsKfQo=