//rohitaas_15
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
void co(auto x) 					{cout<<x<<"\n";}
void co(auto a,auto b) 				{cout<<a<<" "<<b<<"\n";}
void co(auto a,auto b,auto c) 		{cout<<a<<" "<<b<<" "<<c<<"\n";}
void co(auto a,auto b,auto c,auto d){cout<<a<<" "<<b<<" "<<c<<" "<<d<<"\n";}
#define ld 							long double
#define ll                          long long
#define int                         ll
#define dd                          double
#define rohitaas_15();              ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define all(v) 						v.begin(),v.end()
#define f(a,b) 						for(int i=a;i<=b;i++)
#define f2(a,b) 					for(int j=a;j<=b;j++)
#define f3(a,b) 					for(int kk=a;kk<=b;kk++)
#define pb 							push_back
#define mp 							make_pair
#define pii							pair<ll,ll>
#define ff 							first
#define ss 							second
#define nl 							cout<<"\n"
#define lb(v,x) 					lower_bound(v.begin(),v.end(),x)
#define ub(v,x) 					upper_bound(v.begin(),v.end(),x)
#define pv(v,x,n) 					if(n!=0){f(x,n-1){cout<<v[i]<<" ";}cout<<endl;}
#define cn(v,x,n) 					f(x,n){cin>>v[i];}
#define check() 					cout<<"hi"<<"\n"
#define M1 							1000000007
#define M2	 						998244353
#define con 						continue
#define maxv(v) 					*max_element(all(v));
#define minv(v) 					*min_element(all(v));
#define sumv(v) 					accumulate(all(v),0ll)
#define pf 							push_front
#define popb 						pop_back
#define popf 						pop_front
#define br 							break
#define rev(x)  					reverse(all(x))
#define vr 							vector<ll>
#define vvr							vector<vr>
#define vll 						vector<pii>
#define PI 							3.141592653
#define MLL 						map<ll,ll>
#define yes 						co("YES");
#define no 							co("NO");
#define fbo 						find_by_order
#define ook 						order_of_key
#define printclock                  cerr<<"Time : "<<1000*(ld)clock()/(ld)CLOCKS_PER_SEC<<"ms\n";
#define debug1(a) 					cout<<#a<<" = "<<(a)<<endl;
#define debug2(a,b) 				cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<endl
#define debug3(a,b,c)				cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<", "<<#c<<" = "<<(c)<<endl
#define debug4(a,b,c,d) 			cout<<#a<<" = "<<(a)<<", "<<#b<<" = "<<(b)<<", "<<#c<<" = "<<(c)<<", "<<#d<<" = "<<(d)<<endl
mt19937 							rng(chrono::steady_clock::now().time_since_epoch().count());
ll gcd(ll a, ll b)					{if(!b)return a;return gcd(b, a % b);}
ll lcm(ll a , ll b)					{return (a*b)/ gcd(a,b);}
ll modmul(ll a, ll b,ll mod)        { return ((a%mod) * (b%mod)) % mod;}
ll modadd(ll a , ll b,ll mod)       { return((a%mod)+(b%mod)+mod)%mod;}
ll modsub(ll a , ll b,ll mod)       {return((a%mod) - (b%mod) + mod)%mod;}
ll moduloMul(ll a,ll b,ll mod)		{ll res = 0;a %= mod;while (b){if (b & 1)res = (res + a) % mod;a = (2 * a) % mod;b >>= 1;}return res;}
/*ll power(ll x,ll y,ll p=LLONG_MAX)  {ll res = 1;x = x % p;while (y > 0){if (y & 1)res = (res*x) % p;y = y>>1;x = (x*x) % p;}return res;}ll XFEEA,YFEEA,GCDFEEA;
double power2(double x, ll y)       {double res = 1;while (y > 0){if (y & 1)res =(double) (res*x);y = y>>1;x =(double)(x*x);}return res;}
void extendedEuclidAlgo(ll a,ll b)  {if(b==0){XFEEA=1;YFEEA=0;GCDFEEA=a;return;}extendedEuclidAlgo(b,a%b);ll cx=YFEEA;ll cy=XFEEA-(a/b)*YFEEA;YFEEA=cy;XFEEA=cx;}
ll modInverse(ll n,ll m)            {extendedEuclidAlgo(n,m);return (XFEEA%m+m)%m;}
ll CmP(ll n, ll r, ll p=M1)         {if (r==0)return 1;ll fac[n+1];fac[0] = 1;for (ll i=1 ; i<=n; i++)fac[i] = fac[i-1]*i%p;return (fac[n]* modInverse(fac[r], p) % p *modInverse(fac[n-r], p) % p) % p;}
typedef                             tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> orderedset;*/

/*find_by_order(ll k){returns the iterator to the kth smallest element,start from 0,O(logn)}
order_of_key(ll k){returns the number of elements in the set which are strictly less than our k,O(logn)}*/
int numberOfTringles(vr count, ll k)
{
    int sum1 = 0;
    for (int i=0; i<k; i++)
        sum1 += count[i];
    int sum2 = 0;
    int temp[k+1];
    for (int i=0; i<k; i++)
    {
        temp[i] = count[i]*(sum1-count[i]);
        sum2 += temp[i];
    }
    sum2 /= 2;
    int sum3 = 0;
    for (int i=0; i<k; i++)
        sum3 += count[i]*(sum2-temp[i]);
    sum3 /= 3;
    return sum3;
}


pii fun(vr count)
{
    int sum1 = 0;
    for(auto i : count)
    {
        if(i>0)
        {
            sum1 +=(ll)i;
        }
       
    }
    int sum2 = 0;
    ll minn=LLONG_MAX;
    ll index=-1;
    ll len=count.size();
    f(0,len-1)
    {
        if(count[i]<=0)
        {
            con;
        }
        ll x= count[i]*(sum1-count[i]);
        sum2 +=x;
        if(x<=minn)
        {
            minn=x;
            index=i;
        }
    }
    if(sum2%2!=0)
    {
        return mp(0,-1);
    }
    sum2 /= 2;
    if(sum2==0)
    {
        return mp(0,-1);
    }
    return mp(sum2-minn,index);
}

int UK(int W, int c, vr coc,vvr &removal,ll ini)
{
    vr dp(W+1,0ll);
    vvr counts(W+1,vr(c+1,0ll));
    for (int i=0; i<=W; i++)
    {
        ll color=-1;
        if(i!=0)
        dp[i]=dp[i-1];
      for (int j=1; j<=c; j++)
      {
           if (coc[j] <= i)
           {
               ll len=removal[j].size();
               if(counts[i-coc[j]][j]+1>=len)
               {
                   con;
               }
               if(dp[i-coc[j]]+removal[j][counts[i-coc[j]][j]+1]>dp[i])
               {
                   dp[i]=dp[i-coc[j]]+removal[j][counts[i-coc[j]][j]+1];
                   color=j;
               }

           }
      }
      if(color!= -1)
      {
           counts[i]=counts[i-coc[color]];
           counts[i][color]++;
      }
      else
      {
          if(i!=0)
          {
              dp[i]=dp[i-1];
              counts[i]=counts[i-1];
          }
      }
    }
    ll ans=-1;
    for(auto i : dp)
    {
        ans=max(ans,i);
    }
    return min(ans,ini);
}
void solve(){}
void ask(){}
signed main()
{

	//rohitaas_15();
	ll t=1;
	cin>>t;
	ll cccc=t;
	while(t--)
	{
        ll n,c,k;
        cin>>n>>c>>k;
            map<ll,map<ll,ll> > cfreq;
            f(1,n)
            {
                ll x,y,z;
                cin>>x>>y>>z;
                cfreq[z][x]++;
            }
            vr coc(c+1);
            cn(coc,1,c);
            vector<vr> slfreq(c+1);
            for(auto i : cfreq)
            {
                for(auto k : i.ss)
                {
                    slfreq[i.ff].pb(k.ss);
                }
            }
            ll ini=0;
            f(1,c)
            {
                if(coc[i]==0)
                {
                    con;
                }
                if(slfreq[i].size()<=2)
                {
                    con;
                }
                vector<ll> temp;
                for(auto k : slfreq[i])
                {
                    temp.pb(k);
                }
                ini+=numberOfTringles(temp,slfreq[i].size());
            }
            if(k==0 || ini==0)
            {
                co(ini);
                con;
            }
            vector<vr> removal(c+1);
            f(1,c)
            {
                removal[i].pb(0);
                if(coc[i]==0)
                {
                    con;
                }
                ll cnt=1;

                while(true)
                {
                    vector<ll> temp;
                    ll flag=0;
                    for(auto kk : slfreq[i])
                    {
                        if(kk>0)
                        {
                            flag=1;
                        }
                        temp.pb(kk);
                    }
                    if(!flag)
                    {
                        break;
                    }
                    pii x=fun(temp);
                    if(x.ff==0)
                    {
                        br;
                    }
                    removal[i].pb(x.ff);
                    slfreq[i][x.ss]--;
                    cnt++;
                }

            }
            ll rem=UK(k,c,coc,removal,ini);
            co((ini-rem));




	}

	printclock;
}

	/*cout<<"Case #"<<cccc-t<<": ";*/