#include <bits/stdc++.h>
using namespace std;
bool isBlack[1010][1010];
int myN;
void init(int size) {
  myN = size;
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      isBlack[i][j] = false;
    }
  }
}
bool cek(int a, int b) {
  bool myBool, doBreak;
  myBool = true;
  doBreak = false;
  for (int i = -2; i < 1; i++) {
    if (doBreak) {
      break;
    }
    for (int j = -2; j < 1; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = -1; i < 2; i++) {
    if (doBreak) {
      break;
    }
    for (int j = -2; j < 1; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = 0; i < 3; i++) {
    if (doBreak) {
      break;
    }
    for (int j = -2; j < 1; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = -2; i < 1; i++) {
    if (doBreak) {
      break;
    }
    for (int j = -1; j < 2; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = -1; i < 2; i++) {
    if (doBreak) {
      break;
    }
    for (int j = -1; j < 2; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = 0; i < 3; i++) {
    if (doBreak) {
      break;
    }
    for (int j = -1; j < 2; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = -2; i < 1; i++) {
    if (doBreak) {
      break;
    }
    for (int j = 0; j < 3; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = -1; i < 2; i++) {
    if (doBreak) {
      break;
    }
    for (int j = 0; j < 3; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  myBool = true;
  doBreak = false;
  for (int i = 0; i < 3; i++) {
    if (doBreak) {
      break;
    }
    for (int j = 0; j < 3; j++) {
      if (!isBlack[a + i][b + j]) {
        myBool = false;
        doBreak = true;
        break;
      }
    }
  }
  if (myBool) {
    return true;
  }
  return myBool;
}
void mapPrint() {
  for (int i = 1; i < myN; i++) {
    for (int j = 1; j < myN; j++) {
      cout << isBlack[j][i];
    }
    cout << endl;
  }
  cout << endl;
}
int main() {
  int n, m;
  cin >> n >> m;
  init(n + 1);
  bool myBool = false;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    isBlack[a][b] = true;
    myBool = cek(a, b);
    if (myBool) {
      myBool = true;
      cout << i + 1;
      break;
    }
  }
  if (!myBool) {
    cout << -1;
  }
  return 0;
};
