#include<bits/stdc++.h>
using namespace std;
using ll = long long;
signed main()
{
    int n , m;
    cin>>n>>m;
    vector<int> t(m) , b(m);
    vector<int> f(2 * n + 1 , -1);
    vector<pair<int ,int>> ops;
    for(int i = 0 ; i < m ; i++)
    {
        cin>>b[i]>>t[i];
    }
    stack<int> empty;
    vector<int> nb(2 * n + 1);
    for(int i = 0 ; i < m ; i++)
    {
        if(b[i] == 0)
        {
            empty.push(i);
            continue;
        }
        if(b[i] == t[i])
            continue;
        if(f[t[i]] == -1)
        {
            if(empty.empty())
            {
                cout<<"-1\n";
                return 0;
            }
            int l = empty.top();
            empty.pop();
            ops.push_back({l , i});
            nb[t[i]]++;
            f[t[i]] = l;
        }
        else
        {
            nb[t[i]]++;
            ops.push_back({f[t[i]] , i});
        }
        if(f[b[i]] == -1)
        {
            nb[b[i]]++;
            f[b[i]] = i;
        }
        else
        {
            nb[b[i]]++;
            ops.push_back({f[b[i]] , i});
        }
    }
    for(int i = 1 ; i <= 2 * n ; i++)
    {
        if(nb[i] != 2)
        {
            cout<<"-1\n";
            return 0;
        }
    }
    cout<<(int)ops.size()<<'\n';
    for(auto [u , v] : ops)
    {
        cout<<u + 1<<" "<<v + 1<<'\n';
    }
}
| # | 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... |