# include "bits/stdc++.h"
using namespace std;
using LL = long long;
using ULL = unsigned long long;
const double PI = acos(-1);
template<class T>constexpr T INF() { return ::std::numeric_limits<T>::max(); }
template<class T>constexpr T HINF() { return INF<T>() / 2; }
template <typename T_char>T_char TL(T_char cX) { return tolower(cX); };
template <typename T_char>T_char TU(T_char cX) { return toupper(cX); };
const int vy[] = { -1, -1, -1, 0, 1, 1, 1, 0 }, vx[] = { -1, 0, 1, 1, 1, 0, -1, -1 };
const int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
int popcnt(unsigned long long n) { int cnt = 0; for (int i = 0; i < 64; i++)if ((n >> i) & 1)cnt++; return cnt; }
int d_sum(LL n) { int ret = 0; while (n > 0) { ret += n % 10; n /= 10; }return ret; }
int d_cnt(LL n) { int ret = 0; while (n > 0) { ret++; n /= 10; }return ret; }
LL gcd(LL a, LL b) { if (b == 0)return a; return gcd(b, a%b); };
LL lcm(LL a, LL b) { LL g = gcd(a, b); return a / g*b; };
# define ALL(qpqpq)           (qpqpq).begin(),(qpqpq).end()
# define UNIQUE(wpwpw)        sort(ALL((wpwpw)));(wpwpw).erase(unique(ALL((wpwpw))),(wpwpw).end())
# define LOWER(epepe)         transform(ALL((epepe)),(epepe).begin(),TL<char>)
# define UPPER(rprpr)         transform(ALL((rprpr)),(rprpr).begin(),TU<char>)
# define FOR(i,tptpt,ypypy)   for(LL i=(tptpt);i<(ypypy);i++)
# define REP(i,upupu)         FOR(i,0,upupu)

struct INIT{
    INIT(){
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        cout << fixed << setprecision(13);
    }
}INIT;

//経路圧縮あり、O(α(N))
struct UnionFind {
	UnionFind(size_t size){
        for(int i = 0;i < (int)size;i++){
            par.emplace_back(i);
            rnk.emplace_back(0);
        }
    }
	vector<int> par, rnk;

    int find(int x){
        if(par[x] == x)return x;
        else return par[x] = find(par[x]);
    }

    void unite(int x, int y){
        x = find(x);
        y = find(y);
        if(x == y)return;
        if(rnk[x] < rnk[y]){
            par[x] = y;
        }else{
            par[y] = x;
            if(rnk[x] == rnk[y])rnk[x]++;
        }
    }
    bool same(int x,int y){
        return find(x) == find(y);
    }
};


int n, m;
int a[101010], b[101010];
vector<int> Graph[101010], Tree[101010];
int degcnt[101010], d[101010];

bool _order(int p, int q){
    return d[p] > d[q];
}

int main(){
    cin >> n >> m;
    if(m % 2 == 1){
        cout << -1 << endl;
        return 0;
    }
    REP(i, m){
        cin >> a[i] >> b[i];
        a[i]--, b[i]--;
        Graph[a[i]].emplace_back(b[i]);
        Graph[b[i]].emplace_back(a[i]);
    }
    UnionFind uf(n);
    REP(i, m){
        if(uf.same(a[i], b[i]))continue;
        uf.unite(a[i], b[i]);
        Tree[a[i]].emplace_back(b[i]);
        Tree[b[i]].emplace_back(a[i]);
    }
    REP(i, n)d[i] = HINF<int>();
    d[0] = 0;
    queue<int> q;
    q.push(0);
    while(!q.empty()){
        int p = q.front();
        q.pop();
        for(auto to : Tree[p]){
            if(d[to] != HINF<int>())continue;
            d[to] = d[p] + 1;
            q.push(to);
        }
    }
    vector<int> order(n);
    REP(i, n)order[i] = i;
    map<int, int> morder;
    sort(ALL(order), _order);
    REP(i, n)morder[order[i]] = i;
    vector<pair<int, int>>ans;
    REP(i, n){
        int cur = order[i];
        int num = degcnt[cur] % 2;
        for(auto to : Graph[cur]){
            if(i > morder[to])continue;
            if(num){
                ans.emplace_back(make_pair(cur, to));
                num--;
            }else{
                ans.emplace_back(make_pair(to, cur));
                degcnt[to]++;
            }
        }
    }
    for(auto pa : ans){
        cout << pa.first + 1 << " " << pa.second + 1 << endl;
    }
}

Measured memory_bytes: 20976