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

//package testing;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;
import java.util.Arrays;

public class A{
	static ArrayList<Integer>ask(int i,int n){
		FastScanner fs = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
	    System.out.println("? "+i);
	    ArrayList<Integer>v = new ArrayList<>();
	    for(int j=0;j<n;j++) {
	    	int a = fs.nextInt();
	    	v.add(a);
	    }
	    return v;
	}
	public static void main(String[] args) {
		FastScanner fs = new FastScanner();
		PrintWriter out = new PrintWriter(System.out);
		int test = 1;
		outer: 
		for(int tt=1;tt<=test;tt++) {
			int n=fs.nextInt();
			ArrayList<Integer>arr = ask(1,n);
			boolean done[][] = new boolean[n][n];
			for(int i=0;i<n;i++) {
				for(int j=0;j<n;j++) {
					done[i][j] = false;
				}
			}
			ArrayList<Integer>odd = new ArrayList<>(),even = new ArrayList<>();
			for(int i=1;i<n;i++) {
				if(arr.get(i)%2==0) {
					even.add(i);
				}
				else {
					odd.add(i);
				}
				if(arr.get(i)==1) {
					done[i][0] = done[0][i] = true;
				}
			}
			ArrayList<Integer>v = new ArrayList<>();
			if(odd.size()+1<=(n+1)/2) {
				v = odd;
			}
			else {
				v = even;
			}
			for(int i=0;i<v.size();i++) {
				ArrayList<Integer>w = ask(v.get(i)+1,n);
				for(int j=0;j<n;j++) {
					if(w.get(j)==1) {
						done[j][v.get(i)] = done[v.get(i)][j] = true;
					}
				}
			}
			out.println("!");
			for(int i=0;i<n;i++) {
				for(int j=i+1;j<n;j++) {
					if(done[i][j]==true) {
						out.println(i+1+" "+(j+1));
					}
				}
			}
		}
		out.close();
	}
	static class FastScanner {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer("");
 
		String next() {
			while (!st.hasMoreTokens())
				try {
					st=new StringTokenizer(br.readLine());
				} catch (IOException e) {
					e.printStackTrace();
				}
			return st.nextToken();
		}
 
		int nextInt() {
			return Integer.parseInt(next());
		}
 
		int[] readArray(int n) {
			int[] a=new int[n];
			for (int i=0; i<n; i++)
				a[i]=nextInt();
			return a;
		}
 
		long nextLong() {
			return Long.parseLong(next());
		}
	}

}
