5
5 3
2 4
3 1
4 5
 4
2 4
3 2
2 1
 5
5 3
2 4
3 1
4 5
 2
1 2
 4
3 4
2 3
3 1
 10
8 10
2 9
7 8
4 1
7 3
4 7
2 5
2 4
4 6
 5
3 4
3 2
3 1
1 5
 3
1 2
2 3
 5
1 2
1 3
1 4
1 5

1 2
2 3
2 4
 1 3
2 4
3 5
4 5
 1 2
 1 3
2 3
3 4
 1 4
2 4
2 5
2 9
3 7
4 6
4 7
7 8
8 10
 1 3
1 5
2 3
3 4
 1 2
2 3
 1 2
1 3
1 4
1 5

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h> 
#include <complex>
#include <queue>
#include <set>
#include <unordered_set>
#include <list>
#include <chrono>
#include <random>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <stack>
#include <iomanip>
#include <fstream>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef pair<int,int> p32;
typedef pair<ll,ll> p64;
typedef pair<double,double> pdd;
typedef vector<ll> v64;
typedef vector<int> v32;
typedef vector<vector<int> > vv32;
typedef vector<vector<ll> > vv64;
typedef vector<vector<p64> > vvp64;
typedef vector<p64> vp64;
typedef vector<p32> vp32;
typedef vector<set<ll>> vset;
#define forn(i,e) for(ll i = 0; i < e; i++)
#define forsn(i,s,e) for(ll i = s; i < e; i++)
#define rforn(i,s) for(ll i = s; i >= 0; i--)
#define rforsn(i,s,e) for(ll i = s; i >= e; i--)
#define ln "\n"
#define dbg(x) cout<<#x<<" = "<<x<<ln
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define INF 2e18
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
#define all(x) (x).begin(), (x).end()
#define sz(x) ((ll)(x).size())
//ll fact[300010];

 ll hcf(ll p,ll q) {
     if(p>q)return hcf(q,p);
     if(p==0)return q;
     return hcf(q%p,p);
 }

 ll lcm( ll p,ll q){
     return p*q/hcf(p,q);
 }

 ll power(ll a, ll n, ll mod){
     ll ans = 1;
     while(n){
         if(n%2)ans*=a;
         a*=a;
         n/=2;
         a%=mod;
         ans%=mod;
     }
     return ans;
 }

/*ll binom(ll n,ll r, ll mod){
    if(n<r)return 0;
    ll a=fact[n];
    ll b=power(fact[r],mod-2,mod);
    ll c=power(fact[n-r],mod-2,mod);
    a*=b;
    a%=mod;
    a*=c;
    a%=mod;
    return a;
}//*/
void solve(){
    ll n;
    cin>>n;
    v64 vis(n,0);
    vset ad(n);
    cout<<"? 1\n";
    cout.flush();
    vp64 d;
    forn(i,n){
        ll x;
        cin>>x;
        d.pb(mp(x,i));
    }
    vis[0]=1;
    sort(all(d));
    forsn(i,1,n){
        if(d[i].fi>1)break;
        ll u=d[i].se;
        ad[0].insert(u);
        ad[u].insert(0);
        vis[u]=1;
    }
    rforn(i,n-1){
        ll pos=d[i].se;
        if(vis[pos])continue;
        cout<<"? "<<pos+1<<ln;
        cout.flush();
        v64 d1(n);
        forn(j,n)cin>>d1[j];
        ll u=0;
        v64 temp;
        forn(j,n){
            if(d[j].fi+d1[d[j].se]==d1[0]){
              if(vis[d[j].se]){u=d[j].se;temp.pb(u);continue;}
                ll v=d[j].se;
                vis[v]=1;
                ad[u].insert(v);
                ad[v].insert(u);
                u=v;
                temp.pb(v);
            }
        }
        forn(j,n){
            if(d1[j]==1){
                ad[j].insert(pos);
                ad[pos].insert(j);
                vis[j]=1;
            }
        }
        forn(j,n){
            if(vis[d[j].se])continue;
            if(d[j].fi+d1[d[j].se]==d1[0]+2){
                ll v=d[j].se;
                ll k=d[j].fi-1;
                ll u=temp[k];
                vis[v]=1;
                ad[u].insert(v);
                ad[v].insert(u);
            }
        }

    }
    cout<<"! \n";
    set<p64>ans;
    forn(i,n){
        for(auto j:ad[i]){
            ll p=min(i,j),q=max(i,j);
            ans.insert(mp(p+1,q+1));
        }
    }
    for(auto i:ans)cout<<i.fi<<" "<<i.se<<ln;
    return;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif

 fast_cin();

 /*ll mod=998244353 ;
 fact[0]=1;
 forsn(i,1,300010)fact[i]=(fact[i-1]*i)%mod;
 // */


 /*ll t;
 cin>>t;
 while(t--) {
     solve();
 }//     */ solve();
 return 0;
}