/*
 * IPSC 2001
 * (c) palenica
 */

#include <stdio.h>
#include <assert.h>

const int MAXK = 19;
const int MAXVERT = 1 << MAXK;
int A[MAXVERT], B[MAXVERT];
int buf[MAXVERT], back[MAXVERT];

int K, vert;

int cntbits(int num)
{
  int a;
  for(a=0; num>0; num/=2)
    a += num%2;
  return a;
}

void printset(int set)
{
  int i, bol;
  for(i=K-1, bol=0; i>=0; i--) {
    if ((set & (1<<i)) == 0) continue;
    printf("%d ",K-i);
    bol = 1;
  }
}

void augment()
{
  int zbuf, kbuf;
  int i, tmp, v, found, va, vb;

  zbuf = kbuf = 0;
  for(i=0; i<vert; i++) back[i] = -1;

  for(i=0; i<vert; i++)
    if (A[i]<0) buf[kbuf++] = i;

  found = 0;
  while (zbuf<kbuf && !found) {
    v = buf[zbuf++];
    for(i=0; i<K; i++) {
      vb = v | (1<<i);
      if (vb==v || A[v]==vb) continue;
      back[vb] = v;

      if (B[vb]<0) {
        found = 1;
        while (vb>=0) {
          va = back[vb];
          B[vb] = va;
          tmp = A[va];
          A[va] = vb;
          vb = tmp; 
        }
        break;
      }
    }
  }
  assert(found);
}


int main(int argc, char **argv)
{
  int i, cnt, tmp;

  if (argc>1) sscanf(argv[1], "%d", &K); else K = 11;

  if (K%2 != 1 || K<0 || K>MAXK) {
    printf("Number of cards must be odd and at most %d!\n", MAXK);
    return -1;
  }
  
  vert = 1<<K;
  cnt = 0;
  
  for(i=0; i<vert; i++) {
    A[i] = B[i] = MAXVERT;
    tmp = cntbits(i);
    if (tmp == K/2) { A[i] = -1;  cnt++; }
    if (tmp == (K+1)/2) B[i] = -1; 
  }
  
  for(i=0; i<cnt; i++) {
    augment();
  }

  for(i=vert-1; i>=0; i--) {
    if (B[i]>=MAXVERT) continue;
    tmp = i ^ B[i];
    printset(i); printf("-> "); 
    printset(tmp); printf("\n"); 
  }

  return 0;
}
