In a certain video game, the player controls a hero characterized by a single integer value: power. The hero will have to beat monsters that are also characterized by a single integer value: armor.

On the current level, the hero is facing n caves. To pass the level, the hero must enter all the caves in some order, each cave exactly once, and exit every cave safe and sound. When the hero enters cave i, he will have to fight k_i monsters in a row: first a monster with armor a_{i, 1}, then a monster with armor a_{i, 2} and so on, finally, a monster with armor a_{i, k_i}.

The hero can beat a monster if and only if the hero's power is strictly greater than the monster's armor. If the hero can't beat the monster he's fighting, the game ends and the player loses. Note that once the hero enters a cave, he can't exit it before he fights all the monsters in it, strictly in the given order.

Each time the hero beats a monster, the hero's power increases by 1.

Find the smallest possible power the hero must start the level with to be able to enter all the caves in some order and beat all the monsters.

Input

Each test contains multiple test cases. The first line contains the number of test cases t (1 ≤ t ≤ 10^5). Description of the test cases follows.

The first line of each test case contains a single integer n (1 ≤ n ≤ 10^5) — the number of caves.

The i-th of the next n lines contains an integer k_i (1 ≤ k_i ≤ 10^5) — the number of monsters in the i-th cave, followed by k_i integers a_{i, 1}, a_{i, 2}, …, a_{i, k_i} (1 ≤ a_{i, j} ≤ 10^9) — armor levels of the monsters in cave i in order the hero has to fight them.

It is guaranteed that the sum of k_i over all test cases does not exceed 10^5.

Output

For each test case print a single integer — the smallest possible power the hero must start the level with to be able to enter all the caves in some order and beat all the monsters.

Example

Input


2
1
1 42
2
3 10 15 8
2 12 11


Output


43
13

Note

In the first test case, the hero has to beat a single monster with armor 42, it's enough to have power 43 to achieve that.

In the second test case, the hero can pass the level with initial power 13 as follows: 

  * enter cave 2: 
    * beat a monster with armor 12, power increases to 14; 
    * beat a monster with armor 11, power increases to 15; 
  * enter cave 1: 
    * beat a monster with armor 10, power increases to 16; 
    * beat a monster with armor 15, power increases to 17; 
    * beat a monster with armor 8, power increases to 18. 
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.*;
import java.math.*;


public class Solution
{
	static StringBuilder sb;
	static dsu dsu;
	static long fact[];
	static long mod=(long)(1e9+7);
	static ArrayList<Integer>prime;
	static long A[],dp[];
	static int n;
	static ArrayList<Long>adj[];
	static int num[];
	static ArrayList<String>pre;
	static pair p[];
	//static long A[];
	static boolean check(long val)
	{
		int n=A.length;
		for(int i=0;i<n;i++)
		{
			if(val>=p[i].x)
			{
				val+=adj[p[i].y].size();
			}
			else
				return false;
		}
		
		return true;
	}
	
	static void solve()
    {
		
		int n=i();
		adj=new ArrayList[n];
		
		for(int i=0;i<n;i++)
		adj[i]=new ArrayList<>();
		
		for(int i=0;i<n;i++)
		{
			int k=i();
			for(int j=0;j<k;j++)
			{
				adj[i].add(l());
			}
			
		}
		
		 A=new long[n];
		 p=new pair[n];
		for(int i=0;i<n;i++)
		{
			long min=adj[i].get(0)+1;	
			for(int j=1;j<adj[i].size();j++)
			{
			long x=adj[i].get(j);
			if(x<min+j)
			{
				
			}
			else
			{
				min=x-j+1;
			}	
			}
			p[i]=new pair(min,i);
			//System.out.println(min+" "+i);
		}
		
		
		Arrays.sort(p);
		
		long low=p[0].x;
		
		long high=(long)(1e15);
		
		long ans=-1;
		while(low<=high)
		{
			
			long mid=(low+high)/2;
			if(check(mid))
			{
				ans=mid;
				high=mid-1;
			}
			else
				low=mid+1;
			
			
			
			
		}
		System.out.println(ans);
		//System.out.println(check(14));
		
		
		
		
		
		
		
		
		
    }
	public static void main(String[] args)
	 {
		 sb=new StringBuilder();
		 pre=new ArrayList<>();
		
		 
		 
	     int test=i();
	    for(int tt=1;tt<=test;tt++) 
	    {
	         solve();
	    }
	    System.out.println(sb);
	 }
	 
//*******************************************NCR%P*******************************************************	 
	 static long ncr(int n, int r)
	 {
		 if(r>n)
			 return (long)0;
		 
		 long res=fact[n]%mod;
		 //System.out.println(res);
		 res=((long)(res%mod)*(long)(p(fact[r],mod-2)%mod))%mod;
		 res=((long)(res%mod)*(long)(p(fact[n-r],mod-2)%mod))%mod;
		 //System.out.println(res);
		 return res;
		
		 
	 }
		static long p(long x, long y)//POWER FXN //
		{
			if(y==0)
				return 1;
			
			long res=1;
			while(y>0)
			{
				if(y%2==1)
				{
					res=(res*x)%mod;
					y--;
				}
				
				x=(x*x)%mod;
				y=y/2;
				
				
			}
			return res;
		}
		static long ceil(long num, long den)
		{
			return (long)(num+den-1)/den;
		}
		

//*******************************************END*******************************************************
		static int LowerBound(long a[], long x, int i, int j) 
		{ 
			//X is the key value
			int l=i;int r=j;
			int lb=-1;
			  while(l<=r)
			  {
			    int m=(l+r)/2;
			    
			    if(a[m]>=x) 
			    {
			    	lb=m;
			    	r=m-1;
			    }
			    else l=m+1;
			  }
			  return lb;
		}
		static int UpperBound(long a[], long x, int i, int j) 
		{// x is the key or target value
		    int l=i,r=j;
		    int ans=-1;
		    while(l<=r)
		    {
		       int m=(l+r)/2;
		       
		       if(a[m]<=x) 
		       {
		    	   ans=m;
		    	   l=m+1;
		       }
		       else r=m-1;
		    }
		    return ans;
		 }
		
		
		
	 
	 
	 //*********************************Disjoint set union*************************//
	 static class dsu
	 {
		 int parent[];
		 dsu(int n)
		 {
			 parent=new int[n+1];
			 for(int i=0;i<=n;i++)
				 parent[i]=-1;
		 }
		 int find(int a)
		 {
			 if(parent[a]<0)
				 return a;
			 else
			 {
				 int x=find(parent[a]);
				 parent[a]=x;
				 return x;
			 }
		 }
		 void merge(int a,int b)
		 {
			 a=find(a);
			 b=find(b);
			 if(a==b)
				 return;
			 parent[b]=a;
		 }
	 }
	 
	 
	 
//*******************************************PRIME FACTORIZE *****************************************************************************************************//
	 static TreeMap<Integer,Integer> prime(long n)
	 {
		 TreeMap<Integer,Integer>h=new TreeMap<>();
		 long num=n;
		 for(int i=2;i<=Math.sqrt(num);i++)
		 {
			 if(n%i==0)
			 {
				 int nt=0;
				 while(n%i==0) {
					 n=n/i;
					 nt++;
				 }
				 h.put(i, nt);
			 }
		 }
		 if(n!=1)
			 h.put((int)n, 1);
		 return h;
		 
	 }
	 
	
	
//*************CLASS PAIR ***********************************************************************************************************************************************
	   
	 
	 static class pair implements Comparable<pair>
	    {
	        long x;
	        int y;
	       
	        pair(long x, int y) {
	            this.x = x;
	            this.y = y;
	          
	        }
	        public int compareTo(pair o)
	        {
	        	return(int) (x-o.x);
	        	
	        }
	       
	        @Override
	         public boolean equals(Object o) 
	         { 
	             if (this == o) { 
	                 return true; 
	             } 
	             if (o == null) { 
	                 return false; 
	             } 
	             if (this.getClass() != o.getClass()) { 
	                 return false; 
	             } 
	             pair other = (pair)o; 
	             if (this.x != other.x || this.y!=other.y) { 
	                 return false; 
	             } 
	             return true; 
	         }
	    } 
	        
	        
			
//*************CLASS PAIR *****************************************************************************************************************************************************
	
	
	

    static class InputReader {
        private InputStream stream;
        private byte[] buf = new byte[1024];
        private int curChar;
        private int numChars;
        private SpaceCharFilter filter;

        public InputReader(InputStream stream) {
            this.stream = stream;
        }

        public int read() {
            if (numChars == -1)
                throw new InputMismatchException();
            if (curChar >= numChars) {
                curChar = 0;
                try {
                    numChars = stream.read(buf);
                } catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (numChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }

        public int Int() {
            int c = read();
            while (isSpaceChar(c))
                c = read();
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            int res = 0;
            do {
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        }

        public String String() {
            int c = read();
            while (isSpaceChar(c))
                c = read();
            StringBuilder res = new StringBuilder();
            do {
                res.appendCodePoint(c);
                c = read();
            } while (!isSpaceChar(c));
            return res.toString();
        }

        public boolean isSpaceChar(int c) {
            if (filter != null)
                return filter.isSpaceChar(c);
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }

        public String next() {
            return String();
        }

        public interface SpaceCharFilter {
            public boolean isSpaceChar(int ch);
        }
    }

    static class OutputWriter {
        private final PrintWriter writer;

        public OutputWriter(OutputStream outputStream) {
            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
        }

        public OutputWriter(Writer writer) {
            this.writer = new PrintWriter(writer);
        }

        public void print(Object... objects) {
            for (int i = 0; i < objects.length; i++) {
                if (i != 0)
                    writer.print(' ');
                writer.print(objects[i]);
            }
        }

        public void printLine(Object... objects) {
            print(objects);
            writer.println();
        }

        public void close() {
            writer.close();
        }

        public void flush() {
            writer.flush();
        }
    }

    static InputReader in = new InputReader(System.in);
    static OutputWriter out = new OutputWriter(System.out);
   

    public static int[] sort(int[] a) {
        int n = a.length;
        ArrayList<Integer> l = new ArrayList<>();
        for (int i : a)
            l.add(i);
        Collections.sort(l);
        for (int i = 0; i < l.size(); i++)
            a[i] = l.get(i);
        return a;
    }
    public static long[] sort(long[] a) {
        int n = a.length;
        ArrayList<Long> l = new ArrayList<>();
        for (long i : a)
            l.add(i);
        Collections.sort(l);
        for (int i = 0; i < l.size(); i++)
            a[i] = l.get(i);
        return a;
    }

    public static long pow(long x, long y) {
        long res = 1;
        while (y > 0) {
            if (y % 2 != 0) {
                res = (res * x);// % modulus;
                y--;

            }
            x = (x * x);// % modulus;
            y = y / 2;
        }
        return res;
    }
//GCD___+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    public static long gcd(long x, long y) {
        if (x == 0)
            return y%mod;
        else
            return gcd(y % x, x);
    }
    //****************LOWEST COMMON MULTIPLE   *************************************************************************************************************************************

    public static long lcm(long x, long y) {
        return (x * (y / gcd(x, y)));
    }
//INPUT PATTERN******************************************************************************************************************************************************************
    public static int i() {
        return in.Int();
    }

    public static long l() {
        String s = in.String();
        return Long.parseLong(s);
    }

    public static String s() {
        return in.String();
    }

    public static int[] readArray(int n) {
        int A[] = new int[n];
        for (int i = 0; i < n; i++) {
            A[i] = i();
        }
        return A;
    }

    public static long[] readArray(long n) {
        long A[] = new long[(int) n];
        for (int i = 0; i < n; i++) {
            A[i] = l();
        }
        return A;
    }
    public int[][] deepCopy(int[][] matrix) {
		return java.util.Arrays.stream(matrix).map(el -> el.clone()).toArray($ -> matrix.clone());
		}
 

}






	