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 endl "\n"
#define fast()                        \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL)
#define int long long
#define mod 1000000007
#define pb push_back
#define pi 3.1415926535

// sum += sum;
// sum = ((sum%mod)+mod)%mod;

 // int mex = 10000001;
 // bool prime[10000001];
 // vector<int> primes;
 // map<int,int> mul;
 // vector<int> v;
 // void Sieve()
 // {

 //     memset(prime, true, sizeof(prime));

 //     for (int p = 2; p * p <= mex; p++)
 //     {
 //         if (prime[p] == true)
 //         {
 //             for (int i = p * p; i <= mex; i += p)
 //                 prime[i] = false;
 //         }
 //     }
 //     for(int i=2;i<mex;i++){
 //         if(prime[i])primes.push_back(i);
 //     }

 // }
    vector<int> vis;
    set<pair<int,int>> edges;
    int n;
    int *ask(int node,int n){
        int *ret = new int[n];
        cout<<"? "<<node<<endl;
        for(int i=0;i<n;i++)cin>>ret[i];
            return ret;
    }
void solve()
{ 
    // int n;
    cin>>n;
    vis.clear();
    edges.clear();
    vis.resize(500005,0);
    // edges.resize(500005);
    // for(int i=1;i<=x;i++){
    int odd = 0,even=0;
        int *ret = ask(1,n);
        for(int i=0;i<n;i++){
            if(ret[i]==1){
                edges.insert({1,i+1});
            }
            ret[i]&1==1?odd++:even++;
        }
        if(even>odd){
            for(int i=1;i<n;i++){
                if(ret[i]&1){
                    int *ret1 = ask(i+1,n);
                    for(int j=0;j<n;j++){
                        if(ret1[j]==1)edges.insert({min(i+1,j+1),max(i+1,j+1)});
                    }
                }
            }
        }
        else{
            for(int i=1;i<n;i++){
                if(!(ret[i]&1)){
                    int *ret1 = ask(i+1,n);
                    for(int j=0;j<n;j++){
                        if(ret1[j]==1)edges.insert({min(i+1,j+1),max(i+1,j+1)});
                    }      
                }
            }
        }
    cout<<"!"<<endl;
    for(auto i:edges){
        cout<<i.first<<" "<<i.second<<endl;
    }
    cout.flush();
    }
signed main()
{
    fast();
        // Sieve();
    int t = 1;
             // cin >> t;
    while (t--)
    {
         solve();
           // cout << endl;
    }

    return 0;
}