#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; }