#include<bits/stdc++.h>
#define arrsize 300001
#define dpsize 1001
#define vpp vector<PP>
#define vll vector<ll>
#define vcc vector<char>
#define endl "\n"
#define vbb vector<bool>
#define w(t) while(t--)
#define PP pair<ll,ll>
#define test(x) ll t; cin>>t; w(t) x()
#define __lb lower_bound
#define __ub upper_bound
#define szs(x) x.length()
#define szv(x) x.size()*1ll
#define INF 1999999996000000010
#define ll long long int
#define takeINP(arr,n) for(long long int i=0;i<n;i++) cin>>arr[i];
#define f(i,s,e) for(long long int i=s;i<e;i++)
#define cf(i,s,e) for(long long int i=s;i<=e;i++)
#define rf(i,e,s) for(long long int i=e-1;i>=s;i--)
#define mem(arr) memset(arr,0,sizeof(arr));
#define MOD 1000000007
#define rsz(x,n) x.resize(n)
#define cbit(x) __builtin_popcount(x)
#define rsr(x,n) x.reserve(n)
#define mp(a,b) make_pair(a,b)
#define float long  double
#define pb push_back
#define print(arr,s,e) f(i,s,e) cout<<arr[i]<<" "; cout<<endl;
#define all(v) v.begin(),v.end()
#define ff first
#define ss second
#define vll vector<ll>
#define triplet pair<ll,pair<ll,ll> >
#define MITR(a,b) map<a,b>::reverse_iterator
using namespace std;
using namespace chrono;
bool rcomp(PP a,PP b){
    return a>b;
}

ll cost[arrsize];
vll edges[arrsize];
ll deg[arrsize] = {};

void dfs(ll src, vll &visited, ll col) {
    visited[src] = col;
    for (auto itr : edges[src]) {
        if (visited[itr] != -1) continue;
        dfs(itr, visited, col);
    }
}

void solve() {
    bool cant = false;
    ll n, m; cin >> n >> m;
    f(i, 0, n) cin >> cost[i];
    cf(i, 1, m) {
        ll x, y; cin >> x >> y;
        x--; y--;
        edges[x].push_back(y);
        edges[y].push_back(x);
        deg[x]++; deg[y]++;
        if (deg[x] > cost[x] or deg[y] > cost[y]) {
            cant = true;
        }
    }
    if (cant) {
        cout << "-1" << endl;
        return;
    }
    vll visited(n, -1);
    ll col = 0;
    f(i, 0, n) {
        if (visited[i] != -1) continue;
        dfs(i, visited, col);
        col++;
    }
    vector<vpp> grps(col);
    f(i, 0, n) {
        if (deg[i] != cost[i]) grps[visited[i]].push_back({cost[i] - deg[i], i});
    }

    set<PP> s;
    ll sum = 0;
    f(i, 0, col) {
        sort(all(grps[i]), rcomp);
        if (grps[i].size() < 1) {
            cant = true;
            break;
        }
        else {
            for (auto itr : grps[i]) sum += (itr.ff);
            s.insert(grps[i].back());
            grps[i].pop_back();
        }
    }
    cant = cant or sum != 2 * (n - m - 1);
    if (cant) {
        cout << "-1" << endl;
        return;
    }
    vpp ret;
    while (s.size() > 1) {
        // for (auto elem : s) cout << elem.ff << " " << elem.ss << endl;
        // cout << "------" << endl;
        auto elem1 = *s.begin();
        s.erase(s.begin());
        auto elem2 = *s.rbegin();
        s.erase(elem2);
        elem1.ff--; elem2.ff--;
        ret.push_back({elem1.ss, elem2.ss});

        if (elem1.ff != 0) {
            cout << "-1" << endl;
            return;
        }
        else if (grps[visited[elem1.ss]].size()) {
            s.insert(grps[visited[elem1.ss]].back());
            grps[visited[elem1.ss]].pop_back();
        }

        if (elem2.ff != 0) s.insert(elem2);
        else{
            if (grps[visited[elem2.ss]].size()) {
                s.insert(grps[visited[elem2.ss]].back());
                grps[visited[elem2.ss]].pop_back();
            }
        }
    }
    if (s.size()) {
        cout << "-1" << endl;
        return;
    }
    for (auto itr : ret) cout << itr.ff + 1 << " " << itr.ss + 1 << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
}