#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 5;
vector<int> G[N], vt[N], pr;
int cnt[11], num[11], n, vis[N];
bool is_adj(int u, int v) {
  for (int i = 0; i < G[u].size(); i++)
    if (G[u][i] == v) return true;
  return false;
}
bool check(int u) {
  if (G[u].size() != 4) return false;
  for (int i = 0; i < 4; i++) {
    for (int j = i + 1; j < 4; j++)
      if (G[u][i] == G[u][j]) return false;
  }
  return true;
}
bool ok(int u, int x, int y) {
  if ((vt[y][0] == x && vt[y][1] == u) || (vt[y][2] == x && vt[y][3] == u))
    return true;
  return false;
}
void deal(int u, int x, int y) {
  if (u == 1) return;
  if (vt[y][0] == x && vt[y][1] == u) {
    pr.push_back(vt[y][2]);
    deal(x, y, vt[y][2]);
  } else {
    pr.push_back(vt[y][0]);
    deal(x, y, vt[y][0]);
  }
}
bool dfs(int u, int x, int y, int dep) {
  if (!is_adj(u, y) || !is_adj(x, y)) return false;
  if (y == 1 && dep == n)
    return true;
  else if (dep == n)
    return false;
  for (int i = 0; i < 4; i++)
    if (G[y][i] != x && G[y][i] != u && !vis[G[y][i]]) {
      vis[G[y][i]] = 1;
      if (dfs(x, y, G[y][i], dep + 1)) {
        pr.push_back(y);
        return true;
      }
      vis[G[y][i]] = 0;
    }
  return false;
}
int main() {
  scanf("%d", &n);
  int u, v;
  for (int i = 0; i < n << 1; i++) {
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int i = 1; i <= n; i++)
    if (!check(i)) return puts("-1"), 0;
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++)
      if (i != j) {
        vis[G[1][j]] = 1;
        if (dfs(G[1][i], 1, G[1][j], 1)) {
          pr.push_back(1);
          for (int k = 0; k < n; k++) printf("%d ", pr[k]);
          puts("");
          return 0;
        }
        vis[G[1][j]] = 0;
      }
  }
  puts("-1");
  return 0;
}
