Problem: Nastia has 2 positive integers A and B. She defines that:

  * The integer is good if it is divisible by A ⋅ B; 
  * Otherwise, the integer is nearly good, if it is divisible by A. 



For example, if A = 6 and B = 4, the integers 24 and 72 are good, the integers 6, 660 and 12 are nearly good, the integers 16, 7 are neither good nor nearly good.

Find 3 different positive integers x, y, and z such that exactly one of them is good and the other 2 are nearly good, and x + y = z.

Input

The first line contains a single integer t (1 ≤ t ≤ 10 000) — the number of test cases.

The first line of each test case contains two integers A and B (1 ≤ A ≤ 10^6, 1 ≤ B ≤ 10^6) — numbers that Nastia has.

Output

For each test case print: 

  * "YES" and 3 different positive integers x, y, and z (1 ≤ x, y, z ≤ 10^{18}) such that exactly one of them is good and the other 2 are nearly good, and x + y = z. 
  * "NO" if no answer exists. 

You can print each character of "YES" or "NO" in any case.

If there are multiple answers, print any.

Example

Input


3
5 3
13 2
7 11


Output


YES
10 50 60
YES
169 39 208
YES
28 154 182

Note

In the first test case: 60 — good number; 10 and 50 — nearly good numbers.

In the second test case: 208 — good number; 169 and 39 — nearly good numbers.

In the third test case: 154 — good number; 28 and 182 — nearly good numbers.

Solution (in JAVA):

Solution:
import java.lang.*;
import java.math.*;
import java.io.*;
import java.util.*;

 
public class Practice{
	
	
	 static class FastReader {
	        BufferedReader br;
	        StringTokenizer st;
	 
	        public FastReader()
	        {
	            br = new BufferedReader(
	                new InputStreamReader(System.in));
	        }
	 
	        String next()
	        {
	            while (st == null || !st.hasMoreElements()) {
	                try {
	                    st = new StringTokenizer(br.readLine());
	                }
	                catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            return st.nextToken();
	        }
	 
	        int nextInt() { return Integer.parseInt(next()); }
	 
	        long nextLong() { return Long.parseLong(next()); }
	 
	        double nextDouble()
	        {
	            return Double.parseDouble(next());
	        }
	 
	        String nextLine()
	        {
	            String str = "";
	            try {
	                str = br.readLine();
	            }
	            catch (IOException e) {
	                e.printStackTrace();
	            }
	            return str;
	        }
	    }
	 
	 
	 static int  gcd(int a, int b) {


	    if (b == 0) {
	        return a;}
	    else {
	        return gcd(b, a % b);}}
	 
	 //for prime no
	  static boolean isPrime(int n) {
	        return BigInteger.valueOf(n).isProbablePrime(1);
	    }
	 
	    static boolean isPrime(long n) {
	        return BigInteger.valueOf(n).isProbablePrime(1);
	    }

	 static boolean[] seiveOfEratoSthenes(int n) {
		 boolean isPrime[]=new boolean[n+1];
		 Arrays.fill(isPrime, true);
		 isPrime[0]=false;
		 isPrime[1]=false;
		 for(int i=2;i<=Math.sqrt(n);i++) {
			 for(int j=2*i;j<=n;j+=i) {
				 isPrime[j]=false;
			 }
		 }
		 
		 return isPrime;
		 
	 }
	 
	 static long modulo(long a,long b,int n) {
		 long res=1;
		 
		 while(b>0) {
			 if((b&1)==1) {
				 res=(res*(a%n))%n;
			 }
			 a=((a%n)*(a%n))%n;
			 b=b>>1;
			 
		 }
		 return res;
	 }
	 
	 static class Pair  implements Comparable<Pair>{
		 double a;
		 int b;
		 
		
	
		 
		 Pair(double tim,int index){  
			 this.b=index;
			  
			 this.a=tim;  
		
			 }  
		 public int compareTo(Pair st){  
			 if(a==st.a)  
			 return b-st.b;  
			 else if(a>st.a)  
			 return 1;  
			 else  
			 return -1;  
			 }  
	 } 
	 
	
	 static boolean isPalindrome(String s) {
	        int length = s.length();
	        for (int i = 0; i < length / 2; i++) {
	            if (s.charAt(i) != s.charAt(length - 1 - i)) {
	                return false;
	            }
	        }
	        return true;
	    }
	 
	 	static void reverseArray(int[] arr) {
	        for (int i = 0; i < arr.length / 2; i++) {
	            int temp = arr[i];
	            arr[i] = arr[arr.length - 1 - i];
	            arr[arr.length - 1 - i] = temp;
	        }
	    }
	 
	    static void reverseArray(String[] arr) {
	        for (int i = 0; i < arr.length / 2; i++) {
	            String temp = arr[i];
	            arr[i] = arr[arr.length - 1 - i];
	            arr[arr.length - 1 - i] = temp;
	        }
	    }
	 
	    static void reverseArray(char[] arr) {
	        for (int i = 0; i < arr.length / 2; i++) {
	            char temp = arr[i];
	            arr[i] = arr[arr.length - 1 - i];
	            arr[arr.length - 1 - i] = temp;
	        }
	    }

	    public static void main(String[] args)
	    {
	        FastReader sc = new FastReader();
	        
	        int t=sc.nextInt();
	        while(t-->0) {
	        	long A=sc.nextLong();
	        	long B=sc.nextLong();
	        	
	        	if(B==1) {
	        		System.out.println("NO");
	        		continue;
	        	}

	        	
	        	if(B==2) {
	        		B*=2;
	        		
	        	}
	        	
	        	long z=B*A;
	        	long x=A;
	        	long y=(B-1)*A;
	        	
	        	
	        	
	        	  System.out.println("YES");
	        	  System.out.println(x+" "+y+" "+z);


	        	
	        	
	   
	       
	       
	        }
	     
	    }
	    
	    static long number(int n, int digit) {
	    	
	    	long var=0;
	    	
	    	for(int i=0;i<digit;i++) {
	    		var+=n;
	    		var*=10;
	    	}
	    	var/=10;
	    	return var;
	    	
	    } 
	        
	 	
	    static int binary(int start,int end,int arr[],int v ) {
	 		int Q=0;
	 	    if (end <= start) 
	 	        { Q=(v >= arr[start])?  start : (start-1); }
	 	    else{
	 	  
	 	    int mid = (start + end)/2; 
	 	  
	 	    if(v == arr[mid]) 
	 	       return mid; 
	 	  
	 	    if(v >arr[mid]) {
	 	        Q= binary( mid+1, end,arr, v); }
	 	    else if(v <arr[mid]){
	 	    Q= binary( start, mid-1,arr, v); }}
	 	    return Q;
	 	}
	        	 
 }