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<bits/stdc++.h>
using namespace std;
#define pfi(a) printf("%d",a);
#define pfl(a) printf("%lld",a);
#define pfin(a) printf("%d\n",a);
#define pfln(a) printf("%lld\n",a);
#define pfis(a) printf("%d ",a);
#define pfls(a) printf("%lld ",a);
#define sfi(a) scanf("%d",&a);
#define sfl(a) scanf("%lld",&a);
#define f(i,a,b) for(int i=a;i<b;i++)
#define pb(a) push_back(a)
#define vi vector<int>
#define vll vector<ll>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fast ios::sync_with_stdio(false);cin.tie(NULL)
#define ll long long
#define lb lower_bound
#define ub upper_bound
#define bp(i) __builtin_popcount(i)

ll mod=1e9+7;

ll n;
void dfs(vector<vll> adj,ll u, ll par)
{
    for(ll t:adj[u])
    {
        if(t!=par)
        {    
            cout<<u+1<<" "<<t+1<<endl;
            dfs(adj,t,u);
        }
    }
}
vll ask(ll node)
{
    ll p=node+1;
    cout<<"? "<<p<<endl;
    vll ans(n);
    for(int i=0;i<n;i++){
        cin>>ans[i];
    }
    return ans;
}



int main(){
    fast;
    cin>>n;
    cout<<"? "<<1<<endl;
    vll gt(n);
    for(int i=0;i<n;i++)
    {
        cin>>gt[i];
    }
    vector<vll> adj(n);
    ll os=0,es=0,s=-1;
    for(ll i=0;i<n;i++){
        if(gt[i]%2==1){
            os++;
        }
        else{
            es++;
        }
    }
    if(es<=os)
    {
        for(int i=0;i<n;i++)
        {
            if(gt[i]!=1)
                continue;
            adj[0].pb(i);
            adj[i].pb(0);
        }
        for(int i=2;i<n;i+=2)
        {
            for(int j=0;j<n;j++)
            {
                if(gt[j]==i && 1)
                {
                    vll res = ask(j);
                    for(ll k=0;k<n;k++)
                    {
                        if(res[k]!=1)
                            continue;
                        else
                        {
                            adj[j].pb(k);
                            adj[k].pb(j);
                        }
                    }
                }
            }
        }
    }
    else if(es>os)
    {
        for(int i=1;i<n;i+=2)
        {
            for(int j=0;j<n;j++)
            {
                if(gt[j]==i && 1)
                {
                    vll res = ask(j);
                    for(int k=0;k<n;k++)
                    {
                        if(res[k]!=1)
                            continue;
                        adj[j].pb(k);
                        adj[k].pb(j);
                    }
                }
            }
        }
    }
    cout<<"!"<<endl;
    
    dfs(adj,0,s);
}
