/*
 * ICPC Greater NY Regional, Nov 18, 2018
 * Sub-prime Fibonacci solution by Fred Pickel, C-Scape Consulting Corp
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

#define MAX_COUNT	1000
#define MAX_PRIMES	8192
typedef unsigned short WORD;
typedef struct _hash_ent_
{
	struct _hash_ent_ *pNext;
	WORD a;
	WORD b;
} HASHENT;
#define HASH_FACT 1031
HASHENT hashTab[MAX_COUNT];
HASHENT *hashLook[HASH_FACT];
void HashInit()
{
	int i;
	for(i = 0; i < HASH_FACT ; i++) {
		hashLook[i] = NULL;
	}
}

int HashLook(int a, int b)
{
	WORD wa, wb;
	int hash = ((a << 2) + b) % HASH_FACT;
	HASHENT *pH = hashLook[hash];
	if((a > 65535) || (b > 65535)) {
		return -1;
	}
	wa = (WORD) a;
	wb = (WORD) b;
	while(pH != NULL) {
		if((wa == pH->a) && (wb == pH->b)) {
			return pH - &(hashTab[0]);
		}
		pH = pH->pNext;
	}
	return -1;
}

int HashAdd(int n, int a, int b)
{
	WORD wa, wb;
	int hash = ((a << 2) + b) % HASH_FACT;
	HASHENT *pNew, *pH = hashLook[hash];
	if((a > 65535) || (b > 65535)) {
		return -1;
	}
	wa = (WORD) a;
	wb = (WORD) b;
	pNew = &(hashTab[n-1]);
	pNew->pNext = pH;
	pNew->a = wa;
	pNew->b = wb;
	hashLook[hash] = pNew;
	return 0;
}

WORD subprime[65536], primes[MAX_PRIMES];
int lastPrimeIndex = 0;
int MakePrimes()
{
	int i, j;
	for(i = 1; i < 65536 ; i++) {
		subprime[i] = i;
	}
	for(i = 2; i < 65536 ; i++) {
		if(subprime[i] == i) {
			primes[lastPrimeIndex++] = i;
			for(j = 2*i; j < 65536 ; j += i) {
				if(subprime[j] == j) {
					subprime[j] /= i;
				}
			}
		}
		if(lastPrimeIndex == MAX_PRIMES) {
			fprintf(stderr, "used %d primes at val %d\n", MAX_PRIMES, i);
			return -1;
		}
	}
	return 0;
}

int SubPrime(int n)
{
	int i, p;
	if(n < 65536) {
		return subprime[n];
	}
	for(i = 0; i < lastPrimeIndex ; i++) {
		p = primes[i];
		if((n % p) == 0) {
			return n/p;
		}
		if(p > (n/2)) {
			return n;
		}
	}
	return n;
}

int dbcnt = 0;
int CalcSubprimeFib(int n, int a0, int a1, int *pRet, int *pLen)
{
	int i, a, b, c, ret;
	a = a0; b = a1;
	for(i = 2; i <= n ; i++) {
		if((a > 0x3fff) || (b > 0x3fff)) {
			*pRet = i;
			return -1;
		}
		if(i >= 135) {
			dbcnt++;
		}
		if((ret = HashLook(a, b)) >= 0) {
			*pLen = (i-1) - ret - 1;
			*pRet = (a << 15) | b;
			return i -1;
		}
		if(HashAdd(i-1, a, b) < 0) {
			fprintf(stderr, "HashAdd failed at %d\n", i);
			*pRet = i;
			return -2;
		}
			
		c = SubPrime(a+b);
		a = b;
		b = c;
	}
	*pLen = 0;
	*pRet = c;
	return n;
}

void PrintCycle(int astart, int bstart, int len)
{
	int a, b, c, i, lastRet = 0;
	a = astart; b = bstart;
	printf("%d ", a);
	printf("%d ", b);
	for(i = 2; i < len ; i++) {
		c = SubPrime(a+b);
		if((i % 20) == 19) {
			printf("%d\n", c);
			lastRet = 1;
		} else {
			printf("%d ", c);
			lastRet = 0;
		}
		a = b;
		b = c;
	}
	if(lastRet == 0) {
		printf("\n");
	}
}

char inbuf[256];

int main()
{
	int nprob, curprob, index, n, a0, a1, cnt, ret, len;
	if(fgets(&(inbuf[0]), 255, stdin) == NULL)
	{
		fprintf(stderr, "Read failed on problem count\n");
		return -1;
	}
	if(sscanf(&(inbuf[0]), "%d", &nprob) != 1)
	{
		fprintf(stderr, "Scan failed on problem count\n");
		return -2;
	}
	if(MakePrimes() != 0) {
		return -4;
	}
	for(curprob = 1; curprob <= nprob ; curprob++)
	{
		if(fgets(&(inbuf[0]), 255, stdin) == NULL)
		{
			fprintf(stderr, "Read failed on problem %d header\n", curprob);
			return -3;
		}
		// get prob num count and init vals
		if(sscanf(&(inbuf[0]), "%d %d %d %d", &index, &n, &a0, &a1) != 4)
		{
			fprintf(stderr, "scan failed on problem header problem index %d\n",
				curprob);
			return -6;
		}
		if(index != curprob)
		{
			fprintf(stderr, "problem index %d not = expected problem %d\n",
				index, curprob);
			return -7;
		}
		if(n > MAX_COUNT)
		{
			fprintf(stderr, "problem index %d count %d > MAX %d\n",
				index, n, MAX_COUNT);
			return -8;
		}
		HashInit();
		cnt = CalcSubprimeFib(n, a0, a1, &ret, &len);
		if(cnt == -1) {
			fprintf(stderr, "problem index %d cnt %d a0 %d a1 %d too large step %d\n",
				index, n, a0, a1, ret);
			return -9;
		} else if(cnt == -2) {
			fprintf(stderr, "problem index %d cnt %d a0 %d a1 %d hash fail step %d\n",
				index, n, a0, a1, ret);
			return -10;
		}
		if(cnt < n) {
			printf("%d %d %d\n", curprob, cnt, len);
			PrintCycle((ret >> 15), (ret & 0x7fff), len+2);
		} else {
			printf("%d %d 0\n", curprob, n);
			printf("%d\n", ret);
		}

	}
	return 0;
}

