// Author: Vinay Khilwani   // Language: C++       // @vok8: Codeforces, AtCoder, LeetCode, HackerEarth, TopCoder, Google, FB, CSES, Spoj, GitHub   // @vok_8: CodeChef, GFG   // @vok8_khilwani: HackerRank       // Never Stop Trying.   // Trying to be Better than Myself.       // while(true)   // {   //     if(AC)   //     {   //         break;   //     }   //     else if(Contest Over)   //     {   //         Try.   //         Check out Editorial.   //         Understand.   //         Find out your Mistake.   //         Learn the topic (if new).   //         Solve Problems on that topic (if new).   //         Upsolve that problem.   //         break;   //     }   //     else   //     {   //         Try.   //         Use Pen-Paper.   //         Find errors, edge cases, etc.   //         continue;   //     }   // }       // Optimizations   #pragma GCC optimize( O2 )   #pragma GCC optimize( unroll-loops )   #pragma GCC target( avx2 )   #pragma GCC optimize( Os )       // Libraries   #include <bits/stdc++.h>   using namespace std;   // #include <ext/pb_ds/assoc_container.hpp>    // #include <ext/pb_ds/tree_policy.hpp>    // using namespace __gnu_pbds;       // Debugging   #define dbg(a) cerr<<a<<  n ;   #define debug_a(a) for(auto x:a) {cerr<<x<<   ;} cerr<<  n ;   #define debug_b(a) for(auto x:a) {cerr<< [ <<x.first<< ,  <<x.second<< ] <<  n ;} cerr<<  n ;   #define debug_c(a) for(auto x:a) {debug_a(x)} cerr<<  n ;   #define debug_d(a) for(auto x:a) {debug_b(x)} cerr<<  n ;   #define debug_e(a) cerr<< [ <<a.first<< ,  <<a.second<< ] <<  n ;       // Defines   #define fast ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);   #define loop(i,a,n) for(ll i=a; i<n; i++)   #define rloop(i,a,n) for(int i=a; i>=n; i--)   #define fr(i,a,n,b) for(int i=a; i<n; i+=b)   #define rfr(i,a,n,b) for(int i=a; i>=n; i-=b)   #define IN cin>>   #define OUT cout<<   #define nl   n    #define sz(a) int(a.size())   #define all(a) (a).begin(),(a).end()   #define each(a,b) for(auto &a:b)   #define pb push_back   #define set_bits(a) __builtin_popcountll(a)   #define ar array   #define write(a) for(auto x:a) {OUT x<<   ;} OUT endl;   #define read(a) for(auto &x:a) {IN x;}   // #define oset tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>   using ll=long long int;   using ld=long double;   using pll=pair<ll,ll>;   using pii=pair<int,int>;   using vll=vector<ll>;   using vi=vector<int>;   const ll mod=(ll)(1e9)+7LL;   const ll M=998244353LL;   const int dx[4]={1,0,-1,0};   const int dy[4]={0,1,0,-1};   const ld pi=acos(-1);       // General Functions   ll gcd(ll a, ll b)   {       return (b?gcd(b,a%b):a);   }   ll P(ll B, ll power, ll modulo) //Fast Power   {       ll ans=1LL;       while(power>0LL)       {           if(power%2LL==1LL)           {               ans=(ans*B)%modulo;           }           B=(B*B)%modulo;           power/=2LL;       }       return ans;   }   bool isPrime(ll n)   {       if(n<=1LL)       {           return false;       }       if(n<=3LL)       {           return true;       }       if(n%2==0LL || n%3==0LL)       {           return false;       }       for(ll i=5LL; (i*i)<=n; i+=6LL)       {           if(n%i==0LL || n%(i+2LL)==0LL)           {               return false;           }       }       return true;   }   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   ll get_rand(ll l, ll r)   {       uniform_int_distribution<ll> uid(l,r);       return uid(rng);   }   void vok()   {       fast       #ifndef ONLINE_JUDGE           freopen( input.txt , r ,stdin);           freopen( output.txt , w ,stdout);           freopen( error.txt , w ,stderr);       #endif   }       // Global Variables   const int mxN=int(1e5)+100;   vector<bool> cycle;   ll sizee=0;   vector<bool> vis;      // Solver Function(s)   void dfs_cycle(int u, int p, int color[], int mark[], int par[], int& cyclenumber, vi graph[])   {           // already (completely) visited vertex.       if (color[u] == 2) {           return;       }           // seen vertex, but was not completely visited -> cycle detected.       // backtrack based on parents to find the complete cycle.       if (color[u] == 1) {               cyclenumber++;           int cur = p;           mark[cur] = cyclenumber;               // backtrack the vertex which are           // in the current cycle thats found           while (cur != u) {               cur = par[cur];               mark[cur] = cyclenumber;           }           return;       }       par[u] = p;           // partially visited.       color[u] = 1;           // simple dfs on graph       for (int v : graph[u]) {               // if it has not been visited previously           if (v == par[u]) {               continue;           }           dfs_cycle(v, u, color, mark, par, cyclenumber, graph);       }           // completely visited.       color[u] = 2;   }   void dfs(int u, vi g[])   {       sizee++;       vis[u]=true;       each(x,g[u])       {           if(!vis[x] && !cycle[x])           {               dfs(x,g);           }       }   }   void solve()   {       int n;       IN n;       vi g[n+1];       loop(i,0,n)       {           int u,v;           IN u>>v;           g[u].pb(v);           g[v].pb(u);       }       if(n==3)       {           OUT 6<<nl;           return;       }       int color[n+1];       int par[n+1];       int mark[n+1];       loop(i,0,n+1)       {           color[i]=par[i]=mark[i]=0;       }       int cyclenumber = 0;       int edges = n;       dfs_cycle(1, 0, color, mark, par, cyclenumber, g);       vis=vector<bool>(n+1,false);       vll vv;       cycle=vis;       ll sz_cycle=0;       loop(i,1,n+1)       {           if(mark[i])           {               cycle[i]=true;               sz_cycle++;           }       }       ll ans=(ll)(sz_cycle)*(ll)(sz_cycle-1);       loop(i,1,n+1)       {           if(cycle[i])           {               sizee=0;                dfs(i,g);               ll add=sizee*(sizee-1)/2;               // OUT i<<   <<sizee<<nl;               if(sizee>1)               {                   vv.pb(sizee-1);                   ans+=((sizee-1)*(ll)(sz_cycle-1)*2);               }               ans+=add;               // OUT ans<<nl;               // ans+=((sizee-1)*(ll)(sz(cycle)-1)*2);               // OUT ans<<nl;           }       }       ll sum=0;       ll sq=0;       each(x,vv)       {           sum+=x;           sq+=(x*x);       }       sum*=sum;       ll temp=sum-sq;       ans+=temp;       OUT ans<<nl;   }       // Main Function   int main()   {       vok();       int t=1;       IN t;       while(t--)       {           solve();       }       return 0;   }