On a circle lie 2n distinct points, with the following property: however you choose 3 chords that connect 3 disjoint pairs of points, no point strictly inside the circle belongs to all 3 chords. The points are numbered 1,   2,   ...,   2n in clockwise order.

Initially, k chords connect k pairs of points, in such a way that all the 2k endpoints of these chords are distinct.

You want to draw n - k additional chords that connect the remaining 2(n - k) points (each point must be an endpoint of exactly one chord).

In the end, let x be the total number of intersections among all n chords. Compute the maximum value that x can attain if you choose the n - k chords optimally.

Note that the exact position of the 2n points is not relevant, as long as the property stated in the first paragraph holds.

Input

The first line contains a single integer t (1 ≤ t ≤ 100) — the number of test cases. Then t test cases follow.

The first line of each test case contains two integers n and k (1 ≤ n ≤ 100, 0 ≤ k ≤ n) — half the number of points and the number of chords initially drawn.

Then k lines follow. The i-th of them contains two integers x_i and y_i (1 ≤ x_i,   y_i ≤ 2n, x_i ≠ y_i) — the endpoints of the i-th chord. It is guaranteed that the 2k numbers x_1,   y_1,   x_2,   y_2,   ...,   x_k,   y_k are all distinct.

Output

For each test case, output the maximum number of intersections that can be obtained by drawing n - k additional chords.

Example

Input


4
4 2
8 2
1 5
1 1
2 1
2 0
10 6
14 6
2 20
9 10
13 18
15 12
11 7


Output


4
0
1
14

Note

In the first test case, there are three ways to draw the 2 additional chords, shown below (black chords are the ones initially drawn, while red chords are the new ones):

<image>

We see that the third way gives the maximum number of intersections, namely 4.

In the second test case, there are no more chords to draw. Of course, with only one chord present there are no intersections.

In the third test case, we can make at most one intersection by drawing chords 1-3 and 2-4, as shown below:

<image>
import java.io.*;
import java.util.*;


public class C {//Any Class Name
	
	static class Code {
		
		private void solve(InputReader in, OutputWriter out) throws IOException {
			
			ArrayOpn o= new ArrayOpn();
			int t = in.readInt();
			while(t -- > 0) {
				
				
				int n= in.readInt();
				int k=in.readInt();
				
				int[] pairs= new int[2*n];
				
				for(int i=0; i<k; i++) {
					int a=in.readInt();
					int b=in.readInt();
					pairs[a-1]=b;
					pairs[b-1]=a;
				}
				
				int[] slots= new int[2*n-2*k];
				int idx=0;
				
				for(int i=0; i<2*n; i++) {
					if(pairs[i]==0) {
						slots[idx++]=i;
					}
				}
				
				
				for(int i=0; i<n-k; i++) {
					int a=slots[i];
					int b=slots[n-k+i];
					pairs[a]=b+1;
					pairs[b]=a+1;
				}
				
				int intersection=0;
				
				for(int a=0; a<2*n; a++) {
					int b=pairs[a];
					if(a>b) {
						continue;
					}
					
					for(int ia=0; ia<2*n; ia++) {
						int ib=pairs[ia];
						
						if(ia==a || ia>ib) {
							continue;
						}
						if((a<ia && ia<b)!=(a<ib && ib<b)) {
							++intersection;
						}
					}
				}
				intersection>>=1;
						
				out.printLine(intersection);
				
			}
			out.close();
		}
	}
	
	static class ArrayOpn{
		private int[] aI(InputReader in, int n) {
			int A[]= new int[n];
			for(int i=0; i<n; i++) {
				A[i]=in.readInt();
			}
			return A;
		}
		
		static final Random random = new Random();
		
		private void sort(int A[]) {
			int n = A.length;
			for(int i=0; i<n; i++)
			{
				int j = random.nextInt(n),temp = A[j];
				A[j] = A[i];
				A[i] = temp;
			}
			Arrays.sort(A);
//            return A;
		}
		
		private int[][] mI(InputReader in, int n, int m){
			int A[][]= new int[n][m];
			for(int i=0; i<n; i++) {
				for(int j=0; j<m; j++) {
					A[i][j]=in.readInt();
				}
			}
			return A;
		}
		
		private int minEl(int A[]) {
			int min=Integer.MAX_VALUE;
			for(int e: A) {
				min=Math.min(e, min);
			}
			return min;
		}
		private int maxEl(int A[]) {
			int max=Integer.MIN_VALUE;
			for(int e: A) {
				max=Math.max(e, max);
			}
			return max;
		}
		
		private int occurence(int A[], int e) {
			int c=0;
			for(int k: A) {
				if(k==e) {
					c++;
				}
			}
			return c;
		}
		
		public int linears(int A[], int e) {
			
			for(int i=0; i<A.length; i++) {
				if(A[i]==e) {
					return i;
				}
			}
			return -1;
		}
		
		public int binarys(int A[], int e) {
			int low=0, high=A.length-1;
			while(low<=high) {
				int mid=(low+high)/2;
				if(A[mid]==e) {
					return mid;
				}
				else if(A[mid]<e) {
					low=mid+1;
				}
				else {
					high=mid-1;
				}
			}
			return -1;
		}
		
		public void printAr(OutputWriter out, int A[]) {
			for(int e: A) {
				out.print(e+" ");
			}
		}
	}
	
	static class Pair<F, S>{
		private final F first; //first member of pair
		private final S second; //second member of pair
		
		private Pair(F first, S second) {
			this.first = first;
			this.second = second;
		}
		
		@Override
		public boolean equals(Object o) {
			if (this == o) {
				return true;
			}
			
			if (o == null || getClass() != o.getClass())
				return false;
			
			Pair<? , ?> pair = (Pair<?, ?>) o;
			if(!first.equals(pair.first))
				return false;
			return second.equals(pair.second);
		}
		
		@Override
		public int hashCode() {
			return 31 * first.hashCode() + second.hashCode();
		}
		
		@Override
		public String toString() {
			return "(" + first +", "+ second +")";
		}
		
		
		public static <F,S> Pair<F,S> of(F a, S b) {
			return new Pair<>(a,b);
		}
		public F getFirst() {
			return first;
		}
		
		public S getSecond() {
			return second;
		}
	}
	
	// Comparator for using in Sorting On integers
	static class PairCompare implements Comparator<Pair<Integer, Integer>> {
		@Override
		public int compare(Pair<Integer, Integer> p1, Pair<Integer, Integer> p2) {
			int diff = Integer.compare(p1.first, p2.first);
			if(diff == 0) {
				return Integer.compare(p1.second, p2.second);
			}
			else return diff;
		}
	}
	
	
	
	public static void main(String[] args) throws IOException {
		//initialize
		InputStream inputStream = System.in;
		OutputStream outputStream = System.out;
		InputReader in = new InputReader(inputStream);
		OutputWriter out = new OutputWriter(outputStream);
		Code solver = new Code();
		solver.solve(in, out);
		out.flush();
		out.close();
	}
	
	
	static class InputReader {
		private InputStream stream;
		private byte[] buf = new byte[1024];
		private int curChar;
		private int numChars;
		private SpaceCharFilter filter;
		
		private InputReader(InputStream stream) {
			this.stream = stream;
		}
		
		private 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++];
		}
		
		private String readString() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			StringBuilder res = new StringBuilder();
			do {
				if (Character.isValidCodePoint(c))
					res.appendCodePoint(c);
				c = read();
			} while (!isSpaceChar(c));
			return res.toString();
		}
		
		private int readInt() {
			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;
		}
		
		private long readLong() {
			int c = read();
			while (isSpaceChar(c)) {
				c = read();
			}
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			long res = 0;
			do {
				if (c < '0' || c > '9') {
					throw new InputMismatchException();
				}
				res *= 10;
				res += c - '0';
				c = read();
			} while (!isSpaceChar(c));
			return res * sgn;
		}
		
		private double readDouble() {
			int c = read();
			while (isSpaceChar(c)) {
				c = read();
			}
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			double res = 0;
			while (!isSpaceChar(c) && c != '.') {
				if (c == 'e' || c == 'E') {
					return res * Math.pow(10, readInt());
				}
				if (c < '0' || c > '9') {
					throw new InputMismatchException();
				}
				res *= 10;
				res += c - '0';
				c = read();
			}
			if (c == '.') {
				c = read();
				double m = 1;
				while (!isSpaceChar(c)) {
					if (c == 'e' || c == 'E') {
						return res * Math.pow(10, readInt());
					}
					if (c < '0' || c > '9') {
						throw new InputMismatchException();
					}
					m /= 10;
					res += (c - '0') * m;
					c = read();
				}
			}
			return res * sgn;
		}
		
		private boolean isSpaceChar(int c) {
			if (filter != null)
				return filter.isSpaceChar(c);
			return isWhitespace(c);
		}
		
		public String next() {
			return readString();
		}
		
		
		private static boolean isWhitespace(int c) {
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}
		
		private char readCharacter() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			return (char) c;
		}
		
		public interface SpaceCharFilter {
			boolean isSpaceChar(int ch);
		}
	}
	
	static class OutputWriter {
		private final PrintWriter writer;
		
		private OutputWriter(OutputStream outputStream) {
			writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
					outputStream)));
		}
		
		private OutputWriter(Writer writer) {
			this.writer = new PrintWriter(writer);
		}
		
		private void print(Object... objects) {
			for (int i = 0; i < objects.length; i++) {
				if (i != 0) {
					writer.print(' ');
				}
				writer.print(objects[i]);
			}
			writer.flush();
		}
		
		private void printLine(Object... objects) {
			print(objects);
			writer.println();
			writer.flush();
		}
		
		private void printLine(int i) {
			writer.println(i);
		}
		
		
		private void close() {
			writer.close();
		}
		
		private void flush() {
			writer.flush();
		}
		
		
	}
	
	static class IOUtils {
		
		private static int[] readIntArray(InputReader in, int size) {
			int[] array = new int[size];
			for (int i = 0; i < size; i++)
				array[i] = in.readInt();
			return array;
		}
		
		private static long[] readLongArray(InputReader in, int size) {
			long[] array = new long[size];
			for (int i = 0; i < size; i++)
				array[i] = in.readLong();
			return array;
		}
		
		private static char[] readCharArray(InputReader in, int size) {
			char[] array = new char[size];
			for (int i = 0; i < size; i++)
				array[i] = in.readCharacter();
			return array;
		}
		
		private static char[][] readTable(InputReader in, int rowCount,
				int columnCount) {
			char[][] table = new char[rowCount][];
			for (int i = 0; i < rowCount; i++)
				table[i] = readCharArray(in, columnCount);
			return table;
		}
		
	}
	
	static class ArrayUtils {
		
		private static void fill(int[][] array, int value) {
			for (int[] row : array)
				Arrays.fill(row, value);
		}
		
	}
	
	static class MiscUtils {
		private static final int[] DX4 = {1, 0, -1, 0};
		private static final int[] DY4 = {0, -1, 0, 1};
		
		private static boolean isValidCell(int row, int column, int rowCount,
				int columnCount) {
			return row >= 0 && row < rowCount && column >= 0
					&& column < columnCount;
		}
		
	}
}