#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> g[100005];
int nb[100005][2];
bool visited[100005];
void solve6() {
  int p[7], i, j;
  memset(p, 0, sizeof(p));
  for (i = 1; i <= 6; ++i) {
    if (g[i].size() != 4) {
      printf("-1\n");
      return;
    }
    sort(g[i].begin(), g[i].end());
    for (j = 1; j <= 6; ++j) {
      if (j == i) continue;
      if (find(g[i].begin(), g[i].end(), j) == g[i].end()) {
        p[i] = j;
        break;
      }
    }
  }
  for (i = 1; i <= 6; ++i) {
    int k = p[i];
    if (p[k] != i) {
      printf("-1\n");
      return;
    }
  }
  vector<bool> visited(7, false);
  vector<int> left, right;
  for (i = 1; i <= 6; ++i) {
    if (!visited[i]) {
      visited[i] = true;
      left.push_back(i);
      right.push_back(p[i]);
      visited[p[i]] = true;
    }
  }
  left.insert(left.end(), right.begin(), right.end());
  for (i = 0; i < 6; ++i) printf("%d%c", left[i], i == 5 ? '\n' : ' ');
}
bool check(int u, int v) {
  return find(g[u].begin(), g[u].end(), v) != g[u].end();
}
int main() {
  int i, a, b;
  scanf("%d", &n);
  for (i = 0; i < 2 * n; ++i) {
    scanf("%d %d", &a, &b);
    g[a].push_back(b);
    g[b].push_back(a);
  }
  if (n == 5) {
    printf("1 2 3 4 5\n");
    return 0;
  }
  if (n == 6) {
    solve6();
    return 0;
  }
  for (i = 1; i <= n; ++i) {
    if (g[i].size() != 4) {
      printf("-1\n");
      return 0;
    }
    int j, k;
    bool connected[4][4];
    memset(connected, false, sizeof(connected));
    int cnt[4];
    memset(cnt, 0, sizeof(cnt));
    for (j = 0; j < 3; ++j) {
      for (k = j + 1; k < 4; ++k) {
        connected[j][k] = check(g[i][j], g[i][k]);
        if (connected[j][k]) {
          cnt[j]++;
          cnt[k]++;
        }
      }
    }
    if (accumulate(cnt, cnt + 4, 0) != 6) {
      printf("-1\n");
      return 0;
    }
    int c2[4], c1[4], idx[2] = {0, 0};
    for (j = 0; j < 4; ++j) {
      if (cnt[j] == 2)
        c2[idx[1]++] = j;
      else if (cnt[j] == 1)
        c1[idx[0]++] = j;
    }
    if (idx[0] != 2 || idx[1] != 2) {
      printf("-1\n");
      return 0;
    }
    nb[i][0] = g[i][c2[0]];
    nb[i][1] = g[i][c2[1]];
  }
  memset(visited, false, sizeof(visited));
  vector<int> path(n);
  path[0] = 1;
  int p = nb[1][0];
  path[1] = nb[1][0];
  visited[1] = true;
  visited[nb[1][0]] = true;
  for (i = 2; i < n; ++i) {
    bool found = false;
    for (int j = 0; j < 2; ++j) {
      if (!visited[nb[p][j]]) {
        int k = nb[p][j];
        visited[k] = true;
        path[i] = k;
        found = true;
        p = k;
        break;
      }
    }
    if (!found) {
      printf("-1\n");
      return 0;
    }
  }
  for (i = 0; i < n; ++i) printf("%d%c", path[i], i == n - 1 ? '\n' : ' ');
  return 0;
}
