N = gets.to_i
As = gets.split.map{_1.to_i - 1}
INF = 10**10

f = ->(a, b){a*N + b}
ma = ->(a, b){a > b ? a : b}
dp = Array.new(N*N, -INF)
m1, m2 = Array.new(N, -INF), Array.new(N, -INF)
m, ans = 0, 0
dp[f[*As.take(2)]] = 0
m1[As[0]], m2[As[1]] = 0, 0
upd = []
(1 ... N).each do |i|
  as = As[3*i - 1, 3]
  if as.uniq.one?
    ans += 1
  else
    a, b, c = as
    if as.uniq.size == 2
      x = (a == b || a == c) ? a : b
      y = a == b ? c : a == c ? b : a
      (0 ... N).each{|j| upd << [j, y, ma[dp[f[x, j]], dp[f[j, x]] + 1]]}
    end
    upd << [b, c, dp[f[a, a]] + 1] << [a, c, dp[f[b, b]] + 1] << [a, b, dp[f[c, c]] + 1]
    upd << [a, b, m] << [a, c, m] << [b, c, m]
    (0 ... N).each do |j|
      upd << [j, a, ma[m1[j], m2[j]]] << [j, b, ma[m1[j], m2[j]]] << [j, c, ma[m1[j], m2[j]]]
    end
    upd.each do |j, k, v|
      dp[f[j, k]] = ma[dp[f[j, k]], v]
      m1[j] = ma[m1[j], dp[f[j, k]]]
      m2[k] = ma[m2[k], dp[f[j, k]]]
      m = ma[m, dp[f[j, k]]]
    end
    upd = []
  end
end
puts ans + ma[m, dp[f[As.last, As.last]] + 1]