description: Alice and Borys are playing tennis.
  
  A tennis match consists of games. In each game, one of the players is serving and the other one is receiving.
  
  Players serve in turns: after a game where Alice is serving follows a game where Borys is serving, and vice versa.
  
  Each game ends with a victory of one of the players. If a game is won by the serving player, it's said that this player holds serve. If a game is won by the receiving player, it's said that this player breaks serve.
  
  It is known that Alice won a games and Borys won b games during the match. It is unknown who served first and who won which games.
  
  Find all values of k such that exactly k breaks could happen during the match between Alice and Borys in total.
  
  Input
  
  Each test contains multiple test cases. The first line contains the number of test cases t (1 ≤ t ≤ 10^3). Description of the test cases follows.
  
  Each of the next t lines describes one test case and contains two integers a and b (0 ≤ a, b ≤ 10^5; a + b > 0) — the number of games won by Alice and Borys, respectively.
  
  It is guaranteed that the sum of a + b over all test cases does not exceed 2 ⋅ 10^5.
  
  Output
  
  For each test case print two lines.
  
  In the first line, print a single integer m (1 ≤ m ≤ a + b + 1) — the number of values of k such that exactly k breaks could happen during the match.
  
  In the second line, print m distinct integers k_1, k_2, …, k_m (0 ≤ k_1 < k_2 < … < k_m ≤ a + b) — the sought values of k in increasing order.
  
  Example
  
  Input
  
  
  3
  2 1
  1 1
  0 5
  
  
  Output
  
  
  4
  0 1 2 3
  2
  0 2
  2
  2 3
  
  Note
  
  In the first test case, any number of breaks between 0 and 3 could happen during the match: 
  
    * Alice holds serve, Borys holds serve, Alice holds serve: 0 breaks; 
    * Borys holds serve, Alice holds serve, Alice breaks serve: 1 break; 
    * Borys breaks serve, Alice breaks serve, Alice holds serve: 2 breaks; 
    * Alice breaks serve, Borys breaks serve, Alice breaks serve: 3 breaks. 
  
  
  
  In the second test case, the players could either both hold serves (0 breaks) or both break serves (2 breaks).
  
  In the third test case, either 2 or 3 breaks could happen: 
  
    * Borys holds serve, Borys breaks serve, Borys holds serve, Borys breaks serve, Borys holds serve: 2 breaks; 
    * Borys breaks serve, Borys holds serve, Borys breaks serve, Borys holds serve, Borys breaks serve: 3 breaks. 
solution: //Some of the methods are copied from GeeksforGeeks Website  
  import java.util.*;
  import java.lang.*;
  import java.io.*;
  public class Main
  { 
    //static Scanner sc=new Scanner(System.in)
    static  Reader sc=new Reader();
    // static FastReader sc=new FastReader(System.in);
    
    static long mod = (long)(1e9)+ 7;
    static int max_num=(int)1e5+5;
    
   public static void main (String[] args) throws java.lang.Exception
     {
  	try{
  	    /*
  	        int n=sc.nextInt();
  	        Collections.sort(al,Collections.reverseOrder());
  	     
  	        long n=sc.nextLong();
  	        String s=sc.next();
  	        StringBuilder sb=new StringBuilder();
  	     */
  		  int t = sc.nextInt();
  		  while(t-->0)
  		    { 
  		      long a=sc.nextLong();
  		      long b=sc.nextLong();
  		      
  		      long total=a+b;
  		      long point=total/2;
  		     
  		      long min=Math.min(a,b);
  		      
  		     
  		      
  		     
  		       
  		    if(total%2==0)
  		     { 
  		         long left=point-min;
  		      long right=point+min;
  		       ArrayList<Long> al=new ArrayList<>();
  		      for(long i=left;i<=right;i+=2)
  		       {
  		          al.add(i);
  		       }
  		      out.println(al.size());
  		      for(int i=0;i<al.size();i++)
  		         out.print(al.get(i)+" ");
  		       out.println();
  		     }
  		    else
  		     {
  		      ArrayList<Long> al=new ArrayList<>();
  		      long left=total/2-min;
  		      long right=total/2+min+1;
  		      for(long i=left;i<=right;i++)
  		       {
  		          al.add(i);
  		       }
  		      out.println(al.size());
  		      for(int i=0;i<al.size();i++)
  		         out.print(al.get(i)+" ");
  		       out.println();
  		      
  		     }
  		    }
  	     out.flush();
  	     out.close();
  	   }     
  	catch(Exception e)
  		 {}
  	}
   
   /*
     ...SOLUTION ENDS HERE...........SOLUTION ENDS HERE...
   */
   
  static void flag(boolean flag)
     {
         out.println(flag ? "YES" : "NO");
         out.flush();
     }
     
   /*                     
      Map<Long,Long> map=new HashMap<>();
               for(int i=0;i<n;i++)
                 {
                    if(!map.containsKey(a[i]))
                     map.put(a[i],1);
                   else
                     map.replace(a[i],map.get(a[i])+1);
                 }
       
      Set<Map.Entry<Long,Long>> hmap=map.entrySet();
               for(Map.Entry<Long,Long> data : hmap)
                 {
            
                 }
         
     */
     
  //  static class Pair
  //    {
  //       int x,y;
  //       Pair(int x,int y)
  //        {
  //           this.x=x;
  //           this.y=y;
  //        }
  //    }
  
  //  Arrays.sort(p, new Comparator<Pair>()
  //     {
  //        @Override
  //        public int compare(Pair o1,Pair o2)
  //        {
  //           if(o1.x>o2.x) return 1;
  //           else if(o1.x==o2.x)
  //             {
  //                if(o1.y>o2.y) return 1;
  //                else return -1;
  //              }
  //           else return -1;
  //       }});
  
  static void print(int a[])
    {
       int n=a.length;
       for(int i=0;i<n;i++)
         {
            out.print(a[i]+" ");
         }
       out.println();
       out.flush();
    }
  static void print(long a[])
    {
       int n=a.length;
       for(int i=0;i<n;i++)
         {
            out.print(a[i]+" ");
         }
       out.println();
       out.flush();
    } 
  static void print_int(ArrayList<Integer> al)
    {
       int si=al.size();
       for(int i=0;i<si;i++)
         {
            out.print(al.get(i)+" ");
         }
       out.println();
       out.flush();
    }
  static void print_long(ArrayList<Long> al)
    {
       int si=al.size();
       for(int i=0;i<si;i++)
         {
            out.print(al.get(i)+" ");
         }
       out.println();
       out.flush();
    }
    
  static int LowerBound(int a[], int x) 
   { // x is the target value or key
    int l=-1,r=a.length;
    while(l+1<r) {
      int m=(l+r)>>>1;
      if(a[m]>=x) r=m;
      else l=m;
    }
    return r;
  }
  
   static int UpperBound(int a[], int x)
    {// x is the key or target value
      int l=-1,r=a.length;
      while(l+1<r) {
         int m=(l+r)>>>1;
         if(a[m]<=x) l=m;
         else r=m;
      }
      return l+1;
   }
  static void DFS(ArrayList<Integer> graph[],boolean[] visited, int u)
  	{
          visited[u]=true;
          int v=0;
          for(int i=0;i<graph[u].size();i++)
          {
              v=graph[u].get(i);
              if(!visited[v])
                 DFS(graph,visited,v);
          }
    } 
  static boolean[] prime(int num)
   {
  	      boolean[] bool = new boolean[num];
  		     
  		      for (int i = 0; i< bool.length; i++) {
  		         bool[i] = true;
  		      }
  		      for (int i = 2; i< Math.sqrt(num); i++) {
  		         if(bool[i] == true) {
  		            for(int j = (i*i); j<num; j = j+i) {
  		               bool[j] = false;
  		            }
  		         }
  		      }
  		      if(num >= 0) {
  		    	  bool[0] = false;
  		    	  bool[1] = false;
  		      }
  		      
  		      return bool;
    }
  static long nCr(long a,long b,long mod)
  {
   return (((fact[(int)a] * modInverse(fact[(int)b],mod))%mod * modInverse(fact[(int)(a - b)],mod))%mod + mod)%mod;
  }
  static long fact[]=new long[max_num];
  static void fact_fill()
   {
     long fact[]=new long[max_num];
     fact[0]=1l;
  	for(int i=1;i<max_num;i++)
  	  {
  	    fact[i]=(fact[i-1]*(long)i);
  	    if(fact[i]>=mod)
  	      fact[i]%=mod;
  	  } 
   }
  static long modInverse(long a, long m)
  	    {
  	       return power(a, m - 2, m);
  	    }
  static long power(long x, long y, long m)
  	    {
  	        if (y == 0)
  	            return 1;
  	        long p = power(x, y / 2, m) % m;
  	        p = (long)((p * (long)p) % m);
  	        if (y % 2 == 0)
  	            return p;
  	        else
  	            return (long)((x * (long)p) % m);
  	    }
  static long sum_array(int a[])
   {
      int n=a.length;
      long sum=0;
      for(int i=0;i<n;i++)
       sum+=a[i];
      return sum;
   }
  static long sum_array(long a[])
   {
      int n=a.length;
      long sum=0;
      for(int i=0;i<n;i++)
       sum+=a[i];
      return sum;
   }
  
  static void sort(int[] a) 
     {
  		ArrayList<Integer> l=new ArrayList<>();
  		for (int i:a) l.add(i);
  		Collections.sort(l);
  		for (int i=0; i<a.length; i++) a[i]=l.get(i);
  	}
  static void sort(long[] a) 
     {
  		ArrayList<Long> l=new ArrayList<>();
  		for (long i:a) l.add(i);
  		Collections.sort(l);
  		for (int i=0; i<a.length; i++) a[i]=l.get(i);
  	}
  
  static void reverse_array(int a[])
   {
      int n=a.length;
      int i,t; 
      for (i = 0; i < n / 2; i++) { 
              t = a[i]; 
              a[i] = a[n - i - 1]; 
              a[n - i - 1] = t; 
          } 
   }
  static void reverse_array(long a[])
   {
      int n=a.length;
      int i; long t; 
      for (i = 0; i < n / 2; i++) { 
              t = a[i]; 
              a[i] = a[n - i - 1]; 
              a[n - i - 1] = t; 
          } 
   }
  
  static long gcd(long a, long b) 
      { 
          if (a == 0) 
              return b; 
            
          return gcd(b%a, a); 
      } 
  static int gcd(int a, int b) 
      { 
          if (a == 0) 
              return b; 
            
          return gcd(b%a, a); 
      } 
  
     static class FastReader{
   
          byte[] buf = new byte[2048];
          int index, total;
          InputStream in;
   
          FastReader(InputStream is) {
              in = is;
          }
   
          int scan() throws IOException {
              if (index >= total) {
                  index = 0;
                  total = in.read(buf);
                  if (total <= 0) {
                      return -1;
                  }
              }
              return buf[index++];
          }
   
          String next() throws IOException {
              int c;
              for (c = scan(); c <= 32; c = scan());
              StringBuilder sb = new StringBuilder();
              for (; c > 32; c = scan()) {
                  sb.append((char) c);
              }
              return sb.toString();
          }
   
          int nextInt() throws IOException {
              int c, val = 0;
              for (c = scan(); c <= 32; c = scan());
              boolean neg = c == '-';
              if (c == '-' || c == '+') {
                  c = scan();
              }
              for (; c >= '0' && c <= '9'; c = scan()) {
                  val = (val << 3) + (val << 1) + (c & 15);
              }
              return neg ? -val : val;
          }
   
          long nextLong() throws IOException {
              int c;
              long val = 0;
              for (c = scan(); c <= 32; c = scan());
              boolean neg = c == '-';
              if (c == '-' || c == '+') {
                  c = scan();
              }
              for (; c >= '0' && c <= '9'; c = scan()) {
                  val = (val << 3) + (val << 1) + (c & 15);
              }
              return neg ? -val : val;
          }
      }
     
      static class Reader 
      { 
          final private int BUFFER_SIZE = 1 << 16; 
          private DataInputStream din; 
          private byte[] buffer; 
          private int bufferPointer, bytesRead; 
    
          public Reader() 
          { 
              din = new DataInputStream(System.in); 
              buffer = new byte[BUFFER_SIZE]; 
              bufferPointer = bytesRead = 0; 
          } 
    
          public Reader(String file_name) throws IOException 
          { 
              din = new DataInputStream(new FileInputStream(file_name)); 
              buffer = new byte[BUFFER_SIZE]; 
              bufferPointer = bytesRead = 0; 
          } 
    
          public String readLine() throws IOException 
          { 
              byte[] buf = new byte[64]; // line length 
              int cnt = 0, c; 
              while ((c = read()) != -1) 
              { 
                  if (c == '\n') 
                      break; 
                  buf[cnt++] = (byte) c; 
              } 
              return new String(buf, 0, cnt); 
          } 
    
          public int nextInt() throws IOException 
          { 
              int ret = 0; 
              byte c = read(); 
              while (c <= ' ') 
                  c = read(); 
              boolean neg = (c == '-'); 
              if (neg) 
                  c = read(); 
              do
              { 
                  ret = ret * 10 + c - '0'; 
              }  while ((c = read()) >= '0' && c <= '9'); 
    
              if (neg) 
                  return -ret; 
              return ret; 
          } 
    
          public long nextLong() throws IOException 
          { 
              long ret = 0; 
              byte c = read(); 
              while (c <= ' ') 
                  c = read(); 
              boolean neg = (c == '-'); 
              if (neg) 
                  c = read(); 
              do { 
                  ret = ret * 10 + c - '0'; 
              } 
              while ((c = read()) >= '0' && c <= '9'); 
              if (neg) 
                  return -ret; 
              return ret; 
          } 
    
          public double nextDouble() throws IOException 
          { 
              double ret = 0, div = 1; 
              byte c = read(); 
              while (c <= ' ') 
                  c = read(); 
              boolean neg = (c == '-'); 
              if (neg) 
                  c = read(); 
    
              do { 
                  ret = ret * 10 + c - '0'; 
              } 
              while ((c = read()) >= '0' && c <= '9'); 
    
              if (c == '.') 
              { 
                  while ((c = read()) >= '0' && c <= '9') 
                  { 
                      ret += (c - '0') / (div *= 10); 
                  } 
              } 
    
              if (neg) 
                  return -ret; 
              return ret; 
          } 
    
          private void fillBuffer() throws IOException 
          { 
              bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE); 
              if (bytesRead == -1) 
                  buffer[0] = -1; 
          } 
    
          private byte read() throws IOException 
          { 
              if (bufferPointer == bytesRead) 
                  fillBuffer(); 
              return buffer[bufferPointer++]; 
          } 
    
          public void close() throws IOException 
          { 
              if (din == null) 
                  return; 
              din.close(); 
          } 
      }
    static  PrintWriter out=new PrintWriter(System.out);
    static int int_max=Integer.MAX_VALUE;
    static int int_min=Integer.MIN_VALUE;
    static long long_max=Long.MAX_VALUE;
    static long long_min=Long.MIN_VALUE;
  }
  // Thank You !