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 ;

const int mx = 2e3 + 5 ;

int vis[mx] , sum[2] , asked[mx] ;

set<pair<int,int> > s ;

int main()
{
    int n ;
    cin>>n ;
    int ts = 0 ;
    cout<<'?'<<' '<<1<<endl ;
    vis[1] = 1 ;
    for(int i = 1 ; i <= n ; ++i)
    {
        cin>>asked[i] ;
        if(asked[i]==1)
        {
            s.insert({1,i}) ;
            vis[i] = 1 ;
        }
        ++sum[asked[i]&1] ;
    }
    ++sum[1] ;
    if(sum[0]==sum[1]) ts = 2 ;
    else if(sum[0]<sum[1]) ts = 2 ;
    else ts = 1 ;
    vector<int> v ;
    for(int i = 1 ; i <= n ; ++i)
    {
        if(asked[i]==ts) v.push_back(i) , vis[i] = 1 ;
    }
    while(!v.empty())
    {
        vector<int> cur ;
        while(!v.empty())
        {
            int num = v.back() ;
            cout<<'?'<<' '<<num<<endl ;
            v.pop_back() ;
            for(int i = 1 ; i <= n ; ++i)
            {
                cin>>asked[i] ;
                if(asked[i]==1) s.insert({min(i,num),max(i,num)}) , vis[i] = 1 ;
                if(vis[i]) continue ;
                if(asked[i]==2) cur.push_back(i) , vis[i] = 1 ;
            }
        }
        v = cur ;
    }
    cout<<'!'<<endl ;
    for(pair<int,int> x : s)
    {
        cout<<x.first<<' '<<x.second<<endl ;
    }
    return 0 ;
}