#include "bits/stdc++.h"
#include <chrono>
#include <random>
#define lli long long int
using namespace std;
#define mod 1000000007
#define mod1 998244353
#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); 
#define INF 1000000000
#define common cout << "Case #" << w+1 << ": "  
#define maxn 2000010

void setIO(string name) {
	ios_base::sync_with_stdio(0); cin.tie(0);
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}

template< typename T> 
void PVecPrint(vector<T>&v) 
{ 
    for(int i=0;i<(int)v.size();i++) 
        cout << v[i].first << "," << v[i].second << ' '; 
    cout << '\n'; 
}
template<class T> 
void VecPrint(vector<T>&v)
{
    for(int i=0;i<v.size();i++) 
        cout << v[i] << ' ';
    cout << '\n';
}
/*-------------------------------------------------------------------Code-----------------------------------------------------------------*/


string req="haha";
map<string,pair<lli,vector<vector<string> > > >m;
map<string,lli>ml;

int getCnt(string &s)
{
    int n=s.length(),ans=0;
    for(int i=0;i<=n-4;i++)
    {
        if(s.substr(i,4)==req)
            ++ans;
    }
    return ans;
}

int getCnt(vector<string>&v1,vector<string>&v2)
{
    int ans=0;
    for(int i=0;i<v1.size();i++)
    {
        for(int j=0;j<v2.size();j++)
        {
            if(v1[i]+v2[j]==req)
                ++ans;
        }
    }
    return ans;
}

vector<string> getStart(string &s)
{
    int n=s.length();
    vector<string>t;
    for(int i=0;i<min(3,n);i++)
        t.push_back(s.substr(0,i+1));
    return t;
}

vector<string> getEnd(string &s)
{
    int n=s.length();
    vector<string>t;
    for(int i=n-1;i>max(-1,n-4);i--)
        t.push_back(s.substr(i,n-i));
    return t;
}


vector<string> mergeFunc(vector<string>&v1,vector<string>&v2)
{
    vector<string>v3;
    set<string>done;
    for(int i=0;i<v1.size();i++)
    {
        if(done.find(v1[i])==done.end())
        {
            done.insert(v1[i]);
            v3.push_back(v1[i]);
        }
        for(int j=0;j<v2.size();j++)
        {
            string s=v1[i]+v2[j];
            if(s.length()<4 and done.find(s)==done.end())
            {
                done.insert(s);
                v3.push_back(s);
            }
        }
    }
    return v3;
}

void func(string &s1,string &s2,string &s3)
{
    lli tot=m[s2].first+m[s3].first;
    tot+=getCnt(m[s2].second[1],m[s3].second[0]);
    vector<vector<string> >t;
    t.push_back(m[s2].second[0]);
    if(ml[s2]<3)
        t[0]=mergeFunc(m[s2].second[0],m[s3].second[0]);
    t.push_back(m[s3].second[1]);
    if(ml[s3]<3)
        t[1]=mergeFunc(m[s2].second[1],m[s3].second[1]);
    m[s1]={tot,t};
    ml[s1]=ml[s2]+ml[s3];
}

void funcAssign(string &s1,string &s2)
{
    lli tot=getCnt(s2);
    vector<vector<string> >t;
    t.push_back(getStart(s2));
    t.push_back(getEnd(s2));
    m[s1]={tot,t};
    ml[s1]=s2.length();
}

int main()
{
    fastio;
    int te;
    cin >> te;
    while (te--)
    {
        m.clear();
        ml.clear();
        string la="";
        int n;
        cin >> n;
        string s1,s2,s3,s4,s5;
        for(int i=0;i<n;i++)
        {
            cin >> s1 >> s2;
            if(s2==":=")
            {
                cin >> s3;
                funcAssign(s1,s3);
                la=s1;
            }
            else
            {   
                cin >> s3 >> s4 >> s5;
                func(s1,s3,s5);
                la=s1;
            }
        }
        // for(auto &ent:m){
        //     cout << ent.first << ":\n";
        //     cout << ent.second.first << '\n';
        //     VecPrint<string>(ent.second.second[0]);
        //     VecPrint<string>(ent.second.second[1]);
        // }
        cout << m[la].first << '\n';
    }
}