#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int MaxN = 1005;

int n;
int m;
int g[MaxN][MaxN];
int A[MaxN];
int B[MaxN];
vector<int> edges[MaxN];

int last;
int stk[MaxN];
bool mark[MaxN];

int deg[MaxN];

int dfs(int node) {
    if (mark[node]) {
        int cnt = 0;
        int x = node;
        while (stk[last - 1] != node) {
            int nnode = stk[last - 1];
            mark[nnode] = false;
            g[nnode][x] = 1;
            g[x][nnode] = -1;
            x = nnode;
            ++cnt;
            --last;
        }
        g[node][x] = 1;
        g[x][node] = -1;
        return cnt;
    }
    stk[last++] = node;
    mark[node] = true;
    for (vector<int>::iterator it = edges[node].begin(); it != edges[node].end(); ++it) {
        if (*it == (last > 1 ? stk[last - 2] : -1)) continue;
        if (g[node][*it] == 0) {
            int x = dfs(*it);
            if (x > 0) return x - 1;
        }
    }
    --last;
    return 0;
}

void go(int node, int dir) {
    mark[node] = true;
    int cnt = deg[node] / 2;
    for (vector<int>::iterator it = edges[node].begin(); it != edges[node].end(); ++it) {
        if (g[node][*it] == 0) {
            if (cnt > 0) {
                g[node][*it] = dir;
                g[*it][node] = -dir;
                go(*it, dir);
                --cnt;
            } else {
                g[node][*it] = -dir;
                g[*it][node] = dir;
                go(*it, -dir);
            }
        }
    }
}

int main() {
    memset(g, 0, sizeof(g));
    for (int i = 0; i < MaxN; ++i) edges[i].clear();
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i) {
        scanf("%d%d", &A[i], &B[i]);
        --A[i];
        --B[i];
        edges[A[i]].push_back(B[i]);
        edges[B[i]].push_back(A[i]);
    }
    if (m <= 20) {
        bool found = false;
        for (int mask = 0; mask < 1 << m; ++mask) {
            memset(deg, 0, sizeof(deg));
            for (int i = 0; i < m; ++i)
                if ((mask >> i) & 1) {
                    ++deg[B[i]];
                    --deg[A[i]];
                } else {
                    ++deg[A[i]];
                    --deg[B[i]];
                }
            bool ok = true;
            for (int i = 0; i < n; ++i)
                if (deg[i] > 1 || deg[i] < -1)
                    ok = false;
            if (ok) {
                printf("Yes\n");
                for (int i = 0; i < m; ++i)
                    if ((mask >> i) & 1) printf("%d %d\n", A[i] + 1, B[i] + 1);
                    else printf("%d %d\n", B[i] + 1, A[i] + 1);
                found = true;
                break;
            }
        }
        if (!found) printf("No\n");
    } else {
        last = 0;
        for (int i = 0; i < n; ++i)
            if (!mark[i])
                dfs(i);
        memset(deg, 0, sizeof(deg));
        for (int i = 0; i < n; ++i)
            for (vector<int>::iterator it = edges[i].begin(); it != edges[i].end(); ++it)
                if (g[i][*it] == 0)
                    ++deg[i];
        memset(mark, 0, sizeof(mark));
        for (int i = 0; i < n; ++i)
            if (!mark[i])
                go(i, -1);
        memset(deg, 0, sizeof(deg));
        for (int i = 0; i < n; ++i)
            for (vector<int>::iterator it = edges[i].begin(); it != edges[i].end(); ++it)
                if (g[i][*it] == 1) ++deg[i];
                else --deg[i];
        bool ok = true;
        for (int i = 0; i < n; ++i)
            if (deg[i] > 1 || deg[i] < -1)
                ok = false;
        if (!ok) {
            printf("No\n");
        } else {
            printf("Yes\n");
            for (int i = 0; i < n; ++i)
                for (int j = 0; j < n; ++j)
                    if (g[i][j] == 1)
                        printf("%d %d\n", i + 1, j + 1);
        }
    }
    return 0;
}