#include <bits/stdc++.h>
#include <queue>
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define russian setlocale(LC_ALL, "Russian");
#define ll long long
#define ull unsigned long long
#define bigInt __int128
#define dl double long
#define fl float
#define all(s) s.begin(), s.end()
#define pub push_back
#define pob pop_back
#define ins insert
#define mp make_pair
#define F first
#define S second
#define len length
using namespace std;
bigInt binpow(ull n, ull pw, ull md = 18446744073709551615)
{
    bigInt ret;
    if (pw == 0) return 1;
    if (pw % 2)
    {
        ret = binpow(n, pw - 1, md);
        ret *= n;
    }
    else
    {
        ret = binpow(n, pw / 2, md);
        ret *= ret;
    }
    ret %= md;
    return ret;
}
bigInt GSS(ull p, ull k)
{
    if (p == 1)
    {
        bigInt ret = p * (k + 1ULL);
        return ret;
    }
    bigInt ret = binpow(p, k + 1ULL) - 1ULL;
    ret /= p - 1ULL;
    return ret;
}
bigInt ASS(bigInt a, bigInt b, ull n)
{
    bigInt ret = (a + b) * n;
    ret /= 2;
    return ret;
}
bigInt MMI(bigInt a, ull md)
{
    bigInt ret = binpow(a, md - 2ULL, md);
    return ret;
}
bigInt mdiv(bigInt a, bigInt b, ull md)
{
    bigInt ret = a * MMI(b, md);
    ret %= md;
    return ret;
}
bigInt mmul(bigInt a, bigInt b, ull md = 18446744073709551615)
{
    bigInt ret = (a % md) * (b % md);
    ret %= md;
    return ret;
}
bigInt madd(bigInt a, bigInt b, ull md = 18446744073709551615)
{
    bigInt ret = (a % md) + (b % md);
    ret %= md;
    return ret;
}
ull GCD(ull a, ull b)
{
    ull mx = max(a, b), mn = min(a, b);
    a = mx;
    b = mn;
    if (!(a % b))
        return min(a, b);
    else
    {
        ull r = a % b;
        return GCD(b, r);
    }
}
ull GD(ull a)
{
    for (int i = 2; i <= sqrt(a); ++i)
    {
        if (!(a % i))
        {
            ull ret = a / i;
            return ret;
        }
    }
    return 1;
}
void stTrans(stack<int> &st1, stack<int> &st2)
{
    stack<int> tempSt;
    while (st1.size())
    {
        tempSt.push(st1.top());
        st1.pop();
    }
    while (tempSt.size())
    {
        st2.push(tempSt.top());
        tempSt.pop();
    }
}
void stRev(stack<int> &st)
{
    stack<int> tempSt;
    while (st.size())
    {
        tempSt.push(st.top());
        st.pop();
    }
    stTrans(tempSt, st);
}
void stDisp(stack<int> &st)
{
    stack<int> tempSt;
    while (st.size())
    {
        cout << st.top() << ' ';
        tempSt.push(st.top());
        st.pop();
    }
    while (tempSt.size())
    {
        st.push(tempSt.top());
        tempSt.pop();
    }
}
struct pqComp
{
    bool operator()(const pair<int, int>& p1, const pair<int, int>& p2) const
    {
        return (p1.F < p2.F) || (p1.F == p2.F && p1.S < p2.S);
    }
};
bool pCompF(pair<int, int>& p1, pair<int, int>& p2)
{
    return p1.F < p2.F;
}
bool pCompS(pair<int, int>& p1, pair<int, int>& p2)
{
    return p1.S < p2.S;
}
bool pCompFS(pair<int, int>& p1, pair<int, int>& p2)
{
    return (p1.F < p2.F) || (p1.F == p2.F && p1.S > p2.S);
}
vector <pair<int, int>> ds {{0, 1}, {1, 0}, {0, -1}, {-1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
int n, a[200001];
map<int,int> c;
map<int,int> was;

int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    int m = (n + 1) / 2;
    for (int i = 1; i <= n; ++i)
        c[a[i]]++;
    if (c.size() != m)
    {
        cout << -1;
        return 0;
    }
    for (auto [x, y]: c)
    {
        if (y > m)
        {
            cout << -1;
            return 0;
        }
    }
    for (auto [x, y]: c)
        was[y]++;
    for (auto [x, y]: was)
    {
        if (x == 1)
            continue;
        if (was[x - 1])
            was[x - 1]--;
        else
        {
            cout << -1;
            return 0;
        }
    }
    for (auto [x, y]: c)
        cout << x << ' ';
}
/*
НЕ ЗАХОДИТ РЕШЕНИЕ?
1) ПРОВЕРЬ НА ОЧЕВИДНЫЕ ОШИБКИ В КОДЕ
2) ПРОВЕРЬ НА ПЕРЕПОЛНЕНИЯ
3) УБЕДИСЬ В ПРАВИЛЬНОСТИ АЛГОРИТМА
*/