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

//
// :author:   Polusummator
// :date:     13.06.2021 17:38
// :filename: 1534D.cpp
// :team:     LittlePyPy Squad
//
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2")
using namespace std;

#define REP(T) for (int TrT = 0; TrT < (T); TrT++)
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define ll long long
#define ull unsigned long long
#define ld long double
#define Yes cout << "YES\n"
#define No cout << "NO\n"
#define el '\n'
#define fastIO ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
template <class T1, class T2> istream& operator >>(istream& in, pair<T1, T2>& p) {in >> p.first >> p.second; return in;}
template <class T1, class T2> ostream& operator <<(ostream& out, const pair<T1, T2>& p) {out << p.first << ' ' << p.second << '\n'; return out;}
template <class T> istream& operator >>(istream& in, vector<T>& arr) {for (T& i: arr) in >> i; return in;}
template <class T> ostream& operator <<(ostream& out, const vector<T>& arr) {for (const T& i: arr) out << i << ' '; return out;}
template <class T> ostream& operator <<(ostream& out, const vector<vector<T>>& arr) {for (const vector<T>& i: arr) out << i << '\n'; return out;}
template <class T> ostream& operator <<(ostream& out, set<T>& s) {for (const T& i: s) {out << i << ' ';} return out;}
template <class T> void uniq(vector<T>& a) {sort(a.begin(), a.end()); a.resize(unique(a.begin(), a.end()) - a.begin());}

void make_ans(vector<pair<int, int>>& g) {
    uniq(g);
    cout << "!\n";
    cout.flush();
    for (auto &i : g) {
        cout << i.first + 1 << ' ' << i.second + 1 << el;
        cout.flush();
    }
}

void solve() {
    int n;
    cin >> n;
    vector<pair<int, int>> g;
    if (n == 2) {
        cout << "!\n";
        cout.flush();
        cout << "1 2\n";
        cout.flush();
        return;
    }
    vector<int> d(n);
    vector<int> a, b;
    cout << "? 1\n";
    cout.flush();
    cin >> d;
    for (int i = 1; i < n; i++) {
        if (d[i] % 2) {
            b.push_back(i);
        }
        else {
            a.push_back(i);
        }
        if (d[i] == 1) {
            g.emplace_back(0, i);
        }
    }
    if (a.size() > b.size()) {
        swap(a, b);
    }
    for (int i = 0; i < a.size(); i++) {
        cout << "? " << a[i] + 1 << el;
        cout.flush();
        cin >> d;
        for (int j = 0; j < n; j++) {
            if (d[j] == 1) {
                int x = j;
                int y = a[i];
                if (x > y) {
                    swap(x, y);
                }
                g.emplace_back(x, y);
            }
        }
    }
    make_ans(g);
}

signed main() {
//    fastIO;
    int t;
//    cin >> t;
    t = 1;
    REP(t) {
        solve();
    }
    return 0;
}
