#include <iostream>
#include <algorithm>
#include <list>
#include <vector>

#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define FR(i,a) for(int i = 0; i < (a); i++)
using namespace std;


long T,N, s[],d[],w[];

long nextstart_idx,nextdeadline_idx;
struct item
{
	double start,end,w;
};
struct copitem
{
	double start,end,a_idx;
};
struct sort_by_one_item
{
	bool operator () (const item &lhs , const item& rhs) // replace YourStruct
	{
		if(lhs.end == rhs.end)
			return lhs.start < rhs.start;

		return lhs.end < rhs.end;
	}
};
struct sort_by_one_copitem
{
	bool operator () (const copitem &lhs , const copitem& rhs) // replace YourStruct
	{
		if(lhs.start == rhs.start)
			return lhs.end < rhs.end;

		return lhs.start < rhs.start;
	}
};
vector<item> a,savea;
vector<copitem> b,saveb;

bool check(long speed)
{
	long count=0;
	while (count<a.size())
	{
		long i=0;
		while (!b[i].start)
		{
			i++;
		}
		nextstart_idx = b[i].a_idx;
		nextdeadline_idx = 0; 		
		while (!a[nextdeadline_idx].start)
		{
			nextdeadline_idx++;
		}
		if (a[nextstart_idx].start==a[nextdeadline_idx].start && (nextstart_idx!=nextdeadline_idx) )
		{
				nextstart_idx = nextdeadline_idx;
				i=0;
				while (b[i].a_idx!=nextstart_idx) i++;
		}
		if (nextdeadline_idx==nextstart_idx)
		{
			if (nextdeadline_idx<a.size()-1)
				if (a[nextdeadline_idx+1].end==a[nextdeadline_idx].end) return false;
			if ((double)a[nextstart_idx].w/(double)speed + (double)(a[nextstart_idx].start) > (double)(a[nextstart_idx].end)) return false;
			// do all job, clear b[0] and a[0]
			//a.erase(a.begin());b.erase(b.begin());
			
			
			if (i<b.size()-1)
			{
				long j=-1,min=100000;
				FR(v,b.size()-1)
				{
					if (b[v].start<min && v!=i && b[v].start) {j=v;min=b[v].start;}
				}	
				if (j>-1)
				if (b[j].start <= (double)a[nextstart_idx].w/(double)speed + (double)(a[nextstart_idx].start))
					{
						b[j].start = (double)a[nextstart_idx].w/(double)speed + (double)(a[nextstart_idx].start);
						a[b[j].a_idx].start = (double)a[nextstart_idx].w/(double)speed + (double)(a[nextstart_idx].start);
					}
			}
			a[nextstart_idx].end=0; a[nextstart_idx].start = 0;
			b[i].end=0; b[i].start=0;			
			count++;
			// check false case
			
			continue;
		}
		if (a[nextstart_idx].end > a[nextdeadline_idx].start)
		{
			a[nextstart_idx].w -= speed*(a[nextdeadline_idx].start - a[nextstart_idx].start);
			if (a[nextstart_idx].w <=0) 
			{
				a[nextstart_idx].end=0; a[nextstart_idx].start = 0;
				b[nextdeadline_idx].end=0; b[nextdeadline_idx].start=0;
				count++;
				continue;
			}
			a[nextstart_idx].start = a[nextdeadline_idx].start;
			b[i].start = a[nextdeadline_idx].start;
		}
	}
	return true;

}
long long find(long left, long right)
{
	b=saveb;a=savea;
	if (left==right-1)
	{
			if (check(left)) return left;
			else return right;
	}
	long mid = (left+right)/2;
	if (check(mid)) return find(left,mid);
	else return find(mid,right);	
}


void process()
{
	sort(a.begin(),a.end(),sort_by_one_item());
	b.clear();
	FR(v,N)
	{
		item temp = a[v];
		copitem temp1;
		temp1.end = temp.end; temp1.start = temp.start; temp1.a_idx = v;
		b.push_back(temp1);
	}
	sort(b.begin(),b.end(),sort_by_one_copitem());
	savea=a;saveb=b;
	long long t = find(0,10000);
	printf("%d\n",t);
}
int main ()
{
	scanf("%d", &T);
	FR(o,T)
	{
		a.clear();
		scanf("%d", &N);
		FR(v,N)
		{
			item temp;
			scanf("%lf%lf%lf", &temp.start,&temp.end,&temp.w);
			a.push_back(temp);		
		}
		process();
	}
	return 0;
}
