#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=300050;
vector<pair<int,char>> E[N];
int n,m,x[N],y[N];
char s[N],c[N];
void SubTask1(){
    deque<pair<pair<int,int>,char>> q;
    string res[N];
    for(int i=0;i<n;i++)res[i]="";
    for(int i=0;i<n-1;i++){
        if(c[i]=='S')q.pb({{x[i],y[i]},c[i]});
    }
}
void SubTask2(){

}
vector<char> v;
bool was[N];
void DFS3(int c){
    was[c]=1;
    for(auto edge:E[c]){
        if(!was[edge.first]){
            v.pb(edge.second);DFS3(edge.first);
        }
    }
}
void SubTask3(){
    int root=0;
    for(int i=0;i<n;i++)if((int)E[i].size()==1)root=i;
    DFS3(root);
    long long ans=0;
    map<long long,int> cnt;
    cnt[0]=1;
    long long a=0,b=0,d=0;
    for(char c:v){
        a+=c=='S',b+=(c=='I'),d+=(c=='O');
        ans+=cnt[(a+b*N+d*N*2)%(3*N+1)];
        cnt[(a+b*N+d*N*2)%(3*N+1)]++;
        //printf("%lld %lld %lld\n",a,b,d);

    }
    printf("%lld",ans);
}
int main(){
    scanf("%i",&n);
    int cnt=0;
    for(int i=0;i<n-1;i++){
        scanf("%i %i %c",&x[i],&y[i],&c[i]);
        --x[i],--y[i];
        E[x[i]].pb({y[i],c[i]});E[y[i]].pb({x[i],c[i]});
        cnt+=c[i]=='S';
    }
    /*if(cnt==1){
        SubTask1();
        return 0;
    }*/
    /*if(n<=1000){
        SubTask2();
    }*/
    SubTask3();
    return 0;
}