/*
TASK: move
LANG: C
*/
#include <stdio.h>
#define swap(f,g) f=f+g,g=f-g,f=f-g
#define INF 730000
#define MAXH 660000
#define MAXV 340000
#define MAXN 16

int n, m;
int nasl[MAXN][MAXN];
//long h[MAXH];
//long pos[MAXV];
long d[MAXV];
long br[MAXN];
long fak[]={0,1,2,6,24,120,720,5040,40320,362880,3628800};
int a[MAXN];
long kodi;
int u[MAXV];
long q[MAXV];
long front,rear, empty;

void input()
{ int k, l, i;

  scanf("%d %d", &n, &m);
  for(i=0; i<m; i++) {
    scanf("%d %d", &k, &l);
    nasl[k][0]++; nasl[l][0]++;
    nasl[k][nasl[k][0]]=l;
    nasl[l][nasl[l][0]]=k;
  }
  for(i=1; i<=n; i++)  scanf("%d", &a[i]);
  scanf("%ld", &kodi);
return;
}

long decode(long x)
{ long used[MAXN], i, j;

  for(i=1; i<=n; i++) { br[i]=0; used[i]=0; }
  i=1;
  while(x>0) {
    j=2;
    while( (j-1-br[j-1]-1)*(fak[n-i+1]/(n-i+1))<x ) {
         j++;
     }
     if(used[j-1])
                  while(j<=(n+1) && used[j-1]) { j++; }
     used[j-1]=1;
     a[i]=j-1;
     x-=((j-1-br[j-1]-1)*(fak[n-i+1]/(n-i+1)));
     i++;
  }
 /*
  if(i<n) {
    while(i<=n) {
      for(j=1; j<=n; j++) {
        if(!used[j]) break;
      }
      a[i]=j;
      i++;
    }
  }
 */
  for(i=1; i<=n; i++) printf("%d ", a[i]);
return i;
}

void initq()
{
  front=rear=empty=0;
return;
}

void push(long x)
{
  q[rear]=x;
  if(rear==(MAXV-1)) rear=0;
   else rear++;
return;
}

long pop()
{ long res;

   res=q[front+1];
   if(front==(MAXN-1)) front=0;
    else front++;
   if(front==rear) empty=1;
return res;
}

long code()
{ long kod=0, i, j;

  for(i=1; i<=n; i++) { br[i]=0; }
  for(i=1; i<=n; i++) {
    kod+=(a[i]-br[a[i]]-1)*(fak[n-i+1]/(n-i+1));
    for(j=a[i]; j<=n; j++) br[j]++;
  }
 return kod;
}

void bfs(long x)
{ long v,z, k, i;

  initq(); push(x); d[v]=0; u[x]=1;
  while(front!=rear && empty) {
    v=pop();
    k=decode(v);
    for(i=1; i<=nasl[k][0]; i++) {
       swap(a[k], a[nasl[k][0]]);
       if(!u[z=code()])  {
         u[z]=1;
         d[z]=d[v]+1;
         push(z);
       }
    }
  }
return;
}

void solve()
{ long i;

  bfs(code(a));
  for(i=1; i<=n; i++) a[i]=i;
  printf("%ld\n", d[code()]);
return;
}

/*
void shift_up(long i)
{ long x=h[i], j=i<<1;

  while(j<=h[0]) {
    if( (j+1)<=h[0] && d[h[j]]>d[h[j+1]]) j++;
    if( d[h[j]]>=d[x]) break;
    h[i]=h[j];
    i=j;
    pos[h[i]]=i;
    j<<=1;
  }
  h[i]=x;
  pos[h[i]]=i;
return;
}

void shift_down(long i)
{ long x=h[i], j=i>>1;

  while(j>=1) {
   if(d[h[j]]<=d[x]) break;
   h[i]=h[j];
   i=j;
   pos[h[i]]=i;
   j>>=1;
  }
  h[i]=x;
  pos[h[i]]=i;
}

void push(long x)
{
  h[++h[0]]=x;
  pos[h[h[0]]]=h[0];
  shift_up(h[0]);
return;
}

long pop()
{ long res;

  res=h[1];
  pos[h[1]]=-1;
  h[1]=h[0]--;
  pos[h[1]]=1;
return res;
}

long code()
{ long kod=0, i, j, t=0;

  for(i=0; i<=n; i++) br[i]=0;
  for(i=1; i<=n; i++) {
    kod+=((a[i]-1-br[a[i]])*fak[n-i-t]);
    t++;
    for(j=a[i]+1; j<=n; j++) br[j]++;
  }

return kod;
}
*/
/*
long decode(long x)
{ long i, j, k=1, turn=0;

  for(i=1; i<=n; i++) br[i]=0;
  while(x>0) {
   j=turn;
   while(j<=n && fak[j-br[j]]<x) {
     j++;
   }
   x-=fak[n]/(j-1); a[k]=j; k++;
   turn++;
   for(i=j; i<=n; i++) br[i]++;
  }
   for(i=1; i<=n; i++) if(a[i]==1) break;
return i;
}
*/
/*
long code()
{ long kod=0, i , j ;

   for(i=1; i<=n; i++) br[i]=0;
   for(i=1; i<=n; i++) {
     kod+=(a[i]-1-br[a[i]])*( (fak[n-br[i]]/(n-1)));
     for(j=i; j<=n; j++) br[j]++;
   }
return kod;
}
*/
/*
long decode(long x)
{ long k, i ,j, t;

  for(i=1; i<=n; i++) br[i]=0;
  while(x>0) {
    j=2;
    while( (fak[n]/n)*(j-1-br[a[j]])<x ) { j++; }
    a[k]=j;
    x-=((fak[n]/n)*(j-1-br[a[j]]));
    for(t=j; t<=n; t++) br[t]++;
  }
return k;
}
*/
/*
void dijkstra(long x)
{ long i, k, v, w, j;

  for(i=0; i<=fak[n]; i++) { d[i]=INF; pos[i]=0; }
  push(x);
  while(h[0]>=1) {
    v=pop();
//    k=decode(v);
    for(j=1; j<=nasl[k][0]; j++) {
      swap(a[k], a[nasl[k][j]]);
      w=code();
      if((d[v]+1)<d[w]) {
        d[w]=(d[v]+1);
        if(pos[w]) shift_up(pos[w]);
         else push(w);
      }
    }
  }

return;
}

void solve()
{ int i;
  dijkstra(code());
  for(i=1; i<=n; i++) {  a[i]=i; }
  printf("%ld\n", d[code()]);
return;
}
*/
int main()
{
//   freopen("temp.in", "rt", stdin);
//   freopen("temp.out", "wt", stdout);
//   input();
//   solve();
//   printf("%ld\n", code());
//   decode(kodi);
//   printf("--\n");
   printf("-1\n");
 return 0;
}

