#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,ans;
string s1,s2;
vector<string> tt;
map<string,vector<string> > G;
map<string,int> cnt_in,cnt_out;
map<string,map<string,int>  > f,GF;
map<string,int> flag;
void dfs(vector<string> t,string now,int len,int mul){
	if(len==4){
		ans+=mul;
		return;
	}
	for(int i=0;i<G[now].size();i++){
		string v=G[now][i];
		if(len==3&&v!=t[0])continue;
		if(len==2){
			if(now==t[1]){
				if(f[now][v]+2>GF[now][v])continue;
			}
			else{
				if(f[now][v]+1>GF[now][v]||f[t[1]][v]+1>GF[t[1]][v])continue;
			}
		}
		if(len==1){
			if(now==t[0]){
				if(f[now][v]+2>GF[now][v])continue;
			}
			else{
				if(f[now][v]+1>GF[now][v]||f[t[0]][v]+1>GF[t[0]][v])continue;
			}
		}
		if((len==0||len==3)&&f[now][v]+1>GF[now][v])continue;
		t.push_back(v);
		mul*=++f[now][v];
		if(len==1)mul*=++f[t[0]][v];
		if(len==2)mul*=++f[t[1]][v];
		dfs(t,v,len+1,mul);
		t.pop_back();
		if(len==1)f[t[0]][v]--;
		if(len==2)f[t[1]][v]--;
		f[now][v]--;
	}
	return;
}
signed main(){
	//freopen("idioms.txt","r",stdin);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s1>>s2>>s2>>s2;
		if(GF[s1][s2]==0)G[s1].push_back(s2);
		GF[s1][s2]++;
		if(++cnt_in[s2]>0){
			if(cnt_out[s2]>1){
				if(flag[s2]==0){
					tt.push_back(s2);
					flag[s2]=1;
				}
			}
		}
		if(++cnt_out[s1]>1){
			if(cnt_in[s1]>0){
				if(flag[s1]==0){
					tt.push_back(s1);
					flag[s1]=1;
				}
			}
		}
	}
	for(int i=0;i<tt.size();i++){
		dfs({tt[i]},tt[i],0,1);
	}
	cout<<ans;
	return 0;
}