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 codeforces;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;
public class codeforces {
	public static void main(String[] args) {
		FastScanner s=new FastScanner();
		PrintWriter out=new PrintWriter(System.out);
		int n=s.nextInt();
		System.out.println("? 1");
		int a[]=s.readArray(n);
		ArrayList<Integer> even=new ArrayList<>(),odd=new ArrayList<>();
		int adj[][]=new int[n][n];
		for(int i=0;i<n;i++) {
			if(a[i]%2==0) {
				if(i!=0)
				  even.add(i);
			}else {
				odd.add(i);
			}
			if(a[i]==1) {
				adj[0][i]=1;
				adj[i][0]=1;
			}
		}
		ArrayList<Integer> sol;
		if((even.size()+1)<=(n+1)/2) {
			sol=even;
		}else {
			sol=odd;
		}
		for(int i:sol) {
			System.out.println("? "+(i+1));
			System.out.flush();
			int dist[]=s.readArray(n);
			for(int j=0;j<n;j++) {
				if(dist[j]==1) {
					adj[i][j]=1;
					adj[j][i]=1;
				}
			}
		}
		System.out.println("!");
		for(int i=0;i<n;i++) {
			for(int j=i;j<n;j++) {
				if(adj[i][j]==1) {
					System.out.println((i+1)+" "+(j+1));
				}
			}
		}
	    out.close();
	}
	
	public static void printb(boolean ans) {
	    if(ans) {
	   		System.out.println("YES");
	    }else {
	   		System.out.println("NO");
	   	}
	}
	static void sort(int[] a) {
		ArrayList<Integer> l=new ArrayList<>();
		for (int i:a)l.add(i);
		Collections.sort(l);
		for (int i=0; i<a.length; i++) a[i]=l.get(i);
	}
	static void sortcol(long a[][],int c) {
		Arrays.sort(a, (x, y) -> {
			 return (int)( x[c] - y[c]);
		});
	}
	static int gcd(int a, int b){
      if (b == 0)
        return a;
      return gcd(b, a % b);
    }
	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());
		}
	}
	
}
class pair implements Comparable<pair>{
	int a , b; 
	pair(int x , int y){
		a=x;
		b=y;
	}
	public int compareTo(pair o) {
		return a != o.a ? a - o.a : b - o.b;
	}
}
 