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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;



public class Try3{
	static final int Mod = 100_000_0007;
	public static void main(String[] args) throws IOException {
		FastScanner fs = new FastScanner();
//		int t= fs.nextInt();
		int t=1;
		while(t-->0) {
			
			int n = fs.nextInt();
			System.out.println("? " + 1);
			
			int a[] = fs.readArray(n);
			
			boolean b[][] = new boolean[n][n];
			
			ArrayList<Integer> even  = new ArrayList<Integer>();
			ArrayList<Integer> odd  = new ArrayList<Integer>();
			
			ArrayList<Integer> ans ;
			
			int e = 0;
			int o= 0;
			for(int i=0 ;i<n;i++) {
				if(a[i]%2==0) {
					if(a[i]!=0)even.add(i);
					
					e++;
					
				}
				else {
					odd.add(i);
					o++;
				}
				
				
				if(a[i]==1) {
					b[0][i] = b[i][0]=true;
				}
				
				
			}
			
			
			if(e<=(n+1)/2 ){
				ans = even;
			}
			else {
				ans=odd;
				
			}
			
			
			for(int x : ans) {
				
				System.out.println("? " + (x+1));
				
				int g[] = fs.readArray(n);
				
				for(int i =0; i<n;i++) {
					if(g[i]==1) {
						b[x][i]=b[i][x]=true;
					}
				}
				
				
				
			}
			
			System.out.println("!");
			
			for(int i =0 ;i<n;i++) {
				for(int j= i+1;j<n;j++) {
					if(b[i][j]) {
						System.out.println(i+1 +  " " + (j+1) ) ;
					}
				}
			}
			
			
			
		}
	}
	
	

	
	static final Random random = new Random();

	static void ruffleSort(int[] a) {
		int n = a.length;// shuffle, then sort
		for (int i = 0; i < n; i++) {
			int oi = random.nextInt(n), temp = a[oi];
			a[oi] = a[i];
			a[i] = temp;
		}
		Arrays.sort(a);
	}

	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());
		}
	}

}
