M = int(input())

cranes_lowest = {}
cranes_highest = {}

for city in range(M):
	number_of_cranes = int(input())
	for crane in range(number_of_cranes):
		crane_id, crane_price = (int(i)for i in input().split())
		if not cranes_lowest.get(crane_id):
			cranes_lowest[crane_id] = {}
		if not cranes_highest.get(crane_id):
			cranes_highest[crane_id] = {}
		if not cranes_lowest[crane_id].get(crane_price):
			cranes_lowest[crane_id][crane_price] = city
		if not cranes_highest[crane_id].get(crane_price):
			cranes_highest[crane_id][crane_price] = city
		if cranes_highest[crane_id][crane_price] < city:
			cranes_highest[crane_id][crane_price] = city

zisk = 0
for crane in cranes_lowest.keys():
	cur_zisk = 0
	for sell_price in sorted(cranes_highest[crane].keys(), reverse=True):
		for buy_price in sorted(cranes_lowest[crane].keys()):
			if cranes_highest[crane][sell_price] > cranes_lowest[crane][buy_price] and sell_price-buy_price > cur_zisk:
				cur_zisk = sell_price-buy_price
	#print(f"zeriav {crane} ma zisk {cur_zisk}")
	if cur_zisk > zisk:
		zisk = cur_zisk

print(zisk)
