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

#include <iostream>
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
#define ll long long
#define inf 9223372036854775807
#define minf -9223372036854775808
#define mod 1000000007
//#define endl "\n"
//#include "stdc++.h"
using namespace std;
ll min(ll a,ll b){
    if(a<b)
    return a;
    return b;
}
ll max(ll a,ll b){
    if(a>b)
    return a;
    return b;
}
ll gcd(ll a,ll b){
    
    if(a==0)
    return b;
    if(b==0)
    return a;
    return gcd(b,a%b);
}

ll power(ll x,ll y){
    x=x%mod;
    if(x==1)
    return 1;
    if(y==0)
    return 1;
    if(y==1)
    return x;
    ll temp=power(x,y>>1);
    if(y&1){
        return ((((temp*temp)%mod)*x)%mod);
    }
    else
    return ((temp*temp)%mod);
}
 
void factorial(ll n,vector<ll> &fact){
    fact[0]=1;
    fact[1]=1;
    for(ll i=2;i<=n;i++)
    fact[i]=(fact[i-1]*(i%mod))%mod;
    return;
}
 
ll inv(ll n){
    return power(n,mod-2);
}
 
ll ncr(ll n,ll r,vector<ll> &fact){
    if(r>n)
    return 0;
    return ((((fact[n]*inv(fact[n-r]))%mod)*inv(fact[r]))%mod);
}
 
void find_primes(ll n,vector<ll> &primes){
    bool isprime[n+1];
    for(ll i=0;i<=n;i++)
    isprime[i]=1;
    isprime[0]=0;
    isprime[1]=0;
    for(ll i=2;i<=n;i++){
        if(isprime[i]){
            for(ll j=i*i;j<=n;j+=i){
                isprime[j]=0;
            }
        }
    }
    for(ll i=0;i<=n;i++){
        if(isprime[i]){
            primes.push_back(i);
        }
    }
    return;
}
 
void find_fact1(ll n,vector<ll> &primes,vector<unordered_map<ll,ll> > &primfact){
    vector<ll> cur(n+1);
    for(ll i=0;i<=n;i++){
        cur[i]=i;
    }
    for(auto x:primes){
        for(ll i=x;i<=n;i+=x){
            ll cnt=0;
            while(cur[i]%x==0){
                cur[i]/=x;
                cnt++;
            }
            primfact[i][x]=cnt;
        }
    }
    return;
}
void find_fact2(ll n,vector<ll> &primes,vector<ll> &sp){
    for(ll i=0;i<=n;i++){
        sp[i]=i;
    }
    for(auto x:primes){
        for(ll i=x*2;i<=n;i+=x){
            sp[i]=min(sp[i],x);
        }
    }
    return;
}

void bfs(ll u,vector<set<ll> >&adj,vector<ll> &dist){
    ll n=adj.size()-1;
    vector<bool> vis(n+1,0);
    vis[u]=1;
    dist[u]=0;
    queue<ll> q;
    q.push(u);
    ll level=1;
    while(!q.empty()){
        ll k=q.size();
        for(ll i=0;i<k;i++){
            ll x=q.front();
            q.pop();
            for(auto y:adj[x]){
                if(!vis[y]){
                    vis[y]=1;
                    dist[y]=level;
                    q.push(y);
                }
            }
        }
        level++;
    }
    return;
}

void solve(){
   ll n;
   cin>>n;
   cout<<"? 1"<<endl;
   vector<pair<ll,ll> > ans;
   vector<ll> v1;
   vector<ll> v2;
   vector<ll> vp;
   for(ll i=1;i<=n;i++){
       ll temp;
       cin>>temp;
       if(temp&1)
       v1.push_back(i);
       else
       v2.push_back(i);
       if(temp==1)
       vp.push_back(i);
   }
   if(v1.size()<v2.size()){
       for(auto x:v1){
           cout<<"? "<<x<<endl;
           for(ll i=1;i<=n;i++){
               ll temp;
               cin>>temp;
               if(temp==1){
                   ans.push_back(make_pair(x,i));
               }
           }
       }
   }
   else{
       for(auto x:v2){
           if(x==1){
               for(auto y:vp)
               ans.push_back(make_pair(x,y));
           }
           else{
               cout<<"? "<<x<<endl;
               for(ll i=1;i<=n;i++){
                   ll temp;
                   cin>>temp;
                   if(temp==1){
                       ans.push_back(make_pair(x,i));
                   }
               }
           }
       }
   }
   cout<<"!"<<endl;
   for(auto x:ans)
   cout<<x.first<<" "<<x.second<<endl;
}
 
 
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    /*ll n1=300000;
    vector<ll> fact(n1+1);
    factorial(n1,fact);*/
    
    
    /*vector<ll> primes;
    ll n2=100000;
    find_primes(n2,primes);*/
 
    /*ll n3=2000000;
    vector<unordered_map<ll,ll> >primfact(n3+1);
    find_fact1(n3,primes,primfact);*/
 
    
    /*ll n3=5000000;
    vector<ll>sp(n3+1);
    find_fact2(n3,primes,sp);*/
    
    
    ll t;
    //cin>>t;
    t=1;
    while(t--) solve();
} 
 
 


