#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const int nax = 2e5+5;
vector<int> adj[nax];
int main() {
    int n,m;
    cin>>n>>m;
    int tab[m+1][2];
    set<int> free;
    int one[n+1];
    memset(one , -1 , sizeof one);
    for (int i = 1; i <= m; ++i)
    {
        cin>>tab[i][0]>>tab[i][1];
        if(tab[i][0]==0) free.insert(i);
        else if(tab[i][1]==0) one[tab[i][0]]=i;
    }
    vector<pair<int,int>> ans;
    for (int i = 1; i <= m; ++i)
    {
        if(tab[i][1]==tab[i][0]) continue;
        if(tab[i][1]!=0){
            if(one[tab[i][1]]!=-1){
                ans.push_back({i,one[tab[i][1]]});
                tab[one[tab[i][1]]][1]=tab[i][1];
                tab[i][1]=0;
            }else{
                ans.push_back({i,*--free.end()});
                one[tab[i][1]]=*--free.end();
                free.erase(*--free.end());
                tab[one[tab[i][1]]][0]=tab[i][1];
                tab[i][1]=0;
            }
            if(one[tab[i][0]]==-1) one[tab[i][0]]=i; 
        }
        if(tab[i][0]!=0){
            if(one[tab[i][0]]==i) continue;
            ans.push_back({i,one[tab[i][0]]});
            tab[one[tab[i][0]]][1]=tab[i][0];
            tab[i][0]=0;
            free.insert(i);
        }
    }
    cout <<ans.size()<<endl;
    for(auto u : ans) cout << u.fi <<" "<<u.se<<endl;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |