#include <bits/stdc++.h>
using namespace std;
const int oo = 1 << 30;
const double PI = M_PI;
const double EPS = 1e-15;
const int MaxV = 100005;
int V, E;
vector<int> g[MaxV];
vector<int> answer;
bool used[MaxV];
int pos[MaxV];
bool find(int node, int x) {
  for (int i = 0; i < 4; i++)
    if (g[node][i] == x) return true;
  return false;
}
bool run() {
  do {
    bool isok = true;
    for (int i = 1; i < V; i++)
      if (!find(pos[i - 1], pos[i])) {
        isok = false;
        break;
      }
    if (!find(pos[0], pos[V - 1])) isok = false;
    if (isok) {
      for (int i = 0; i < V; i++)
        if (!find(pos[(i - 1 + V) % V], pos[(i + 1) % V])) {
          isok = false;
          break;
        }
    }
    if (isok) {
      for (int i = 0; i < V; i++) cout << pos[i] + 1 << " ";
      return true;
    }
  } while (next_permutation(pos, pos + V));
  return false;
}
bool check(vector<int> v) {
  if ((int)v.size() != V) return false;
  for (int i = 0; i < V; i++) {
    if (!find(v[(i - 1 + V) % V], v[i])) return false;
    if (!find(v[(i + 1 + V) % V], v[i])) return false;
    if (!find(v[(i - 2 + V) % V], v[i])) return false;
    if (!find(v[(i + 2 + V) % V], v[i])) return false;
  }
  return true;
}
int main() {
  cin.sync_with_stdio(false);
  cin >> V;
  for (int i = 0; i < 2 * V; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (int i = 0; i < V; i++)
    if (g[i].size() != 4) {
      cout << -1 << endl;
      return 0;
    }
  if (V <= 10) {
    for (int i = 0; i < V; i++) pos[i] = i;
    if (!run()) cout << -1 << endl;
    return 0;
  }
  int u = -1;
  int v = -1;
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < i; j++) {
      int a = g[0][i];
      int b = g[0][j];
      if (!find(a, b)) {
        int share = 0;
        for (int k = 0; k < 4; k++)
          if (find(a, g[b][k])) share++;
        if (share == 1) {
          u = a;
          v = b;
        }
      }
    }
  if (u == -1) {
    cout << -1 << endl;
    return 0;
  }
  vector<int> d;
  for (int k = 0; k < 4; k++) {
    if (g[0][k] == u) continue;
    if (g[0][k] == v) continue;
    d.push_back(g[0][k]);
  }
  vector<int> answer[2];
  for (int k = 0; k < 2; k++) {
    answer[k].push_back(u);
    answer[k].push_back(d[k]);
    answer[k].push_back(0);
    answer[k].push_back(d[1 - k]);
    answer[k].push_back(v);
    used[0] = true;
    used[u] = true;
    used[v] = true;
    used[d[0]] = true;
    used[d[1]] = true;
    int current = 3;
    bool badNode = false;
    for (int i = 0; i < V - 5; i++) {
      int nextNode = -1;
      for (int j = 0; j < 4; j++)
        if (!used[g[answer[k][current]][j]]) {
          nextNode = g[answer[k][current]][j];
          break;
        }
      if (nextNode == -1) {
        badNode = true;
        break;
      }
      current = current + 1;
      used[nextNode] = true;
      answer[k].push_back(nextNode);
    }
    memset(used, false, sizeof(used));
  }
  if (check(answer[0])) {
    for (int i = 0; i < V; i++) cout << answer[0][i] + 1 << " ";
    return 0;
  }
  if (check(answer[1])) {
    for (int i = 0; i < V; i++) cout << answer[1][i] + 1 << " ";
    return 0;
  }
  cout << -1 << endl;
  return 0;
}
