# include <stdio.h>
# include <stdlib.h>
const long int MAXN=1000000;
typedef struct NODL {long int inf; NODL *next;};
typedef struct LISTA{NODL *prim,*ultim;};
LISTA beg[MAXN+1]={NULL,NULL},end[MAXN+1]={NULL,NULL};
long int heap[MAXN+1],heaplen,n,final[MAXN+1],culoare[MAXN+1],used[MAXN+1];
void rise_heap(long int i)
{
long int aux;
while (i>1&&heap[i/2]<heap[i])
{
aux=heap[i];
heap[i]=heap[i/2];
heap[i/2]=aux;
i/=2;
}
}
void submerge_heap(long int i)
{
long int min,aux;
do
{
min=i;
if (2*i<=heaplen&&heap[2*i]>heap[min]) min=2*i;
if (2*i+1<=heaplen&&heap[2*i+1]>heap[min]) min=2*i+1;
if (min==i) break;
aux=heap[i];
heap[i]=heap[min];
heap[min]=aux;
i=min;
}
while (1);
}
long int add(LISTA &l,long int inf,long int pos)
{
NODL *p=(NODL*) malloc (sizeof(NODL));
(*p).inf=inf;
if (l.prim==NULL&&l.ultim==NULL)
{
(*p).next=NULL;
l.prim=l.ultim=p;
return 0;
}
if (pos==0)
{
(*p).next=l.prim;
l.prim=p;
return 0;
}
if (pos==1)
{
(*p).next=NULL;
(*l.ultim).next=p;
l.ultim=p;
return 0;
}
return 0;
}
void scrie_err()
{
FILE *g=fopen("curcubeu.out","w");
fprintf(g,"0\n");
fcloseall();
}
void scrie()
{
long int i;
FILE *g=fopen("curcubeu.out","w");
for (i=1;i<=n-1;i++)
fprintf(g,"%ld\n",final[i]);
fcloseall();
}
int main()
{
NODL *p;
//citire
long int i,a1,b1,c1;
FILE *f=fopen("curcubeu.in","r");
fscanf(f,"%ld%ld%ld%ld",&n,&a1,&b1,&c1);
fclose(f);
//calculeaza
culoare[1]=c1;
if (a1>b1) add(beg[b1],1,1);
else add(beg[a1],1,1);
if (a1>b1) add(end[a1],1,0);
else add(end[b1],1,0);
for (i=2;i<=n-1;i++)
{
a1=(a1*i)%n;
b1=(b1*i)%n;
c1=(c1*i)%n;
culoare[i]=c1;
printf("%ld %ld %ld\n",a1,b1,c1);
if (a1>b1) add(beg[b1],i,1);
else add(beg[a1],i,1);
if (a1>b1) add(end[a1],i,0);
else add(end[b1],i,0);
//add(beg[min(a1,b1)],i,1);
//add(end[max(a1,b1)],i,0);
}
//facem swappingul
used[0]=1;
heaplen=0;
for (i=1;i<=n-1;i++)
{
//incarcam din cozi
p=beg[i].prim;
while (p)
{
heap[++heaplen]=(*p).inf;
rise_heap(heaplen);
p=(*p).next;
}
if (heaplen==0)
{
scrie_err();
return 0;
}
final[i]=culoare[heap[1]];
//descarcam stiva;
p=end[i].prim;
while (p)
{
used[(*p).inf]++;
p=(*p).next;
}
while (heaplen&&used[heap[1]])
{
used[heap[1]]--;
heap[1]=heap[heaplen];
heap[heaplen]=0;
heaplen--;
submerge_heap(1);
}
}
scrie();
return 0;
}