#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

struct teritorija
{
	unsigned pocetak, kraj, prethodni_red;
	teritorija()
	{
	}
	teritorija(unsigned pocetak, unsigned kraj, unsigned prethodni_red)
	{
		this->pocetak = pocetak;
		this->kraj = kraj;
		this->prethodni_red = prethodni_red;
	}
};

static vector<bool> nepozeljni(1000001);
static unordered_map<unsigned, teritorija> teritorije(1000000);
static unsigned n, k, m[2000][2000] = {};

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> k;
	for (unsigned i = 0; i < n; i++)
		for (unsigned j = 0; j < n; j++)
			cin >> m[i][j];
	for (unsigned i = 0; i < n; i++)
		for (unsigned j = 0; j < n;)
		{
			unsigned sorta = m[i][j], pocetak = j;
			while (++j < n && sorta == m[i][j]);
			if (nepozeljni[sorta])
				continue;
			auto prosla = teritorije.find(sorta);
			if (prosla == teritorije.end())
			{
				teritorija trenutna(pocetak, j, i);
				teritorije[sorta] = trenutna;
			}
			else if (prosla->second.pocetak != pocetak ||
			         prosla->second.kraj != j ||
					 prosla->second.prethodni_red != i - 1)
			{
				teritorije.erase(sorta);
				nepozeljni[sorta] = true;
			}
			else
				teritorije[sorta].prethodni_red = i;
		}
	cout << teritorije.size();
}