#include<iostream>
using namespace std;

int br = 0;

void trazi(int levi, int x, int l[], int n, int d[], int znak[], int desni, int rez, char z[], int i, bool bul);

int indeks(int arr[], int n, int x, int p)
{
//	printf("trazim: %d\n",x);
	int rez = -1;
	for(int i = p; i < n; i++)
		if(arr[i] == x)
		{
			rez = i;
			break;
		}
	return rez;
}

void pogledaj(int znak[], int x, char z[], int d[], int desni, int levi, int i)
{
	switch(z[x])
	{
		case 'S': znak[0]++; break;
		case 'I': znak[1]++; break;	
		case 'O': znak[2]++; break;		
	}
	//printf("x u funk je %d\n",x);
	//printf("S: %d, I: %d, O:%d",znak[0],znak[1],znak[2]);
	//printf("\n");
	desni = d[x];
	//printf("levi: %d, desni: %d\n",levi,desni);
	if((levi < desni) && (znak[0] == znak[1] == znak[2]))
	{	
		br++;
		znak[0]=0;
		znak[1]=0;
		znak[2]=0;
		switch(z[i])
		{
			case 'S': znak[0]++; break;
			case 'I': znak[1]++; break;	
			case 'O': znak[2]++; break;		
		}
	}
}

void trazidd(int levi, int x, int l[], int n, int d[], int znak[], int desni, int rez, char z[], int i, bool bul)
{
	if(bul)
		x = indeks(l, n-1, l[x], x+1);
	else
		x = indeks(d, n-1, l[x], 0);
	if(x != -1 )
	{
		pogledaj(znak, x, z, d, desni, levi, i);
		trazidd(levi, x, l, n, d, znak, desni, rez, z, i, bul); //trazi levi u levom
		//pogledaj(znak, x, z, d, desni, levi, i);
		//trazi(levi, x, d, n, l, znak, desni, rez, z, i, true); //trazi desni u desnom
		int y = indeks(d, n-1, d[x], x+1); //gleda dal ima desni u desnom dalje
		if(y != -1)
		{
			pogledaj(znak, x, z, d, desni, levi, i);
			trazidd(levi, y, l, n, d, znak, desni, rez, z, i, bul);
		}
	}
}

void trazi(int levi, int x, int l[], int n, int d[], int znak[], int desni, int rez, char z[], int i, bool bul)
{
	if(bul)
		x = indeks(d, n-1, d[x], x+1);
	else
		x = indeks(l, n-1, d[x], 0);
	//printf("%d\n",x);
	if(x != -1 )
	{
		pogledaj(znak, x, z, d, desni, levi, i);
		trazi(levi, x, l, n, d, znak, desni, rez, z, i, bul); 
		int y = indeks(l, n-1, l[x], x+1); 
		//printf("y: %d\n",y);
		if(y != -1)
		{
			pogledaj(znak, x, z, d, desni, levi, i);
			trazi(levi, y, l, n, d, znak, desni, rez, z, i, bul);
		}
	}
}



main()
{
	int n, levi, desni, x, y, p;
	scanf("%d",&n);
	int l[n-1], d[n-1];
	char z[n-1];
	int znak[3];
	for(int i = 0; i < n - 1; i++)
	{
		scanf("%d%d %c",&l[i],&d[i],&z[i]);
	}
	getchar();
	for(int i = 0; i < n; i++)
	{
		znak[0]=0;
		znak[1]=0;
		znak[2]=0;
		switch(z[i])
		{
			case 'S': znak[0]++; break;
			case 'I': znak[1]++; break;	
			case 'O': znak[2]++; break;		
		}
		levi = l[i];
		x = i;
		trazi(levi, x, l, n, d, znak, desni, 0, z, i, false);
	}
	for(int i = 0; i < n; i++)
	{
		znak[0]=0;
		znak[1]=0;
		znak[2]=0;
		switch(z[i])
		{
			case 'S': znak[0]++; break;
			case 'I': znak[1]++; break;	
			case 'O': znak[2]++; break;		
		}
		levi = l[i];
		x = i;
		trazi(levi, x, l, n, d, znak, desni, 0, z, i, true);
	}
	for(int i = 0; i < n; i++)
	{
		znak[0]=0;
		znak[1]=0;
		znak[2]=0;
		switch(z[i])
		{
			case 'S': znak[0]++; break;
			case 'I': znak[1]++; break;	
			case 'O': znak[2]++; break;		
		}
		levi = l[i];
		x = i;
		trazidd(levi, x, l, n, d, znak, desni, 0, z, i, false);
	}
	for(int i = 0; i < n; i++)
	{
		znak[0]=0;
		znak[1]=0;
		znak[2]=0;
		switch(z[i])
		{
			case 'S': znak[0]++; break;
			case 'I': znak[1]++; break;	
			case 'O': znak[2]++; break;		
		}
		levi = l[i];
		x = i;
		trazidd(levi, x, l, n, d, znak, desni, 0, z, i, true);
	}
	printf("%d",br);
}