#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
struct DSU {
    vector<int> parent;
    
    DSU(int n) {
        parent.resize(n);
        iota(parent.begin(), parent.end(), 0);
    }
    
    int find_set(int v) {
        if (v == parent[v])
            return v;
        return parent[v] = find_set(parent[v]); 
    }
    void union_sets(int a, int b) {
        a = find_set(a);
        b = find_set(b);
        if (a != b) {
            parent[b] = a;
        }
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n, m;
    if (!(cin >> n >> m)) return 0;
    
    vector<vector<int>> matrix(n, vector<int>(n, 0));
    int virtual_top = n * n;
    int virtual_bottom = n * n + 1;
    
    DSU dsu(n * n + 2);
    
    int dr[] = {-1, 1, 0, 0};
    int dc[] = {0, 0, -1, 1};
    
    int result = -1;
    
    for (int i = 1; i <= m; i++) {
        int r, c;
        cin >> r >> c;
        if (result != -1) continue;
        
        matrix[r][c] = 1;
        int current_id = r * n + c; 

        if (r == 0) {
            dsu.union_sets(current_id, virtual_top);
        }
        if (r == n - 1) {
            dsu.union_sets(current_id, virtual_bottom);
        }
        for (int d = 0; d < 4; d++) {
            int nr = r + dr[d];
            int nc = c + dc[d];
            if (nr >= 0 && nr < n && nc >= 0 && nc < n && matrix[nr][nc] == 1) {
                int neighbor_id = nr * n + nc;
                dsu.union_sets(current_id, neighbor_id);
            }
        }
        if (dsu.find_set(virtual_top) == dsu.find_set(virtual_bottom)) {
            result = i;
        }
    }
    cout << result << "\n";
    return 0;
}