import sys input = sys.stdin.readline from bisect import bisect N,M=map(int,input().split()) seg_el=1<<((M+1).bit_length()) # Segment treeの台の要素数 def getvalue(n,seg_el): # 一点の値を取得 i=n+seg_el ANS=1<<60 ANS=min(SEG[i],ANS) i>>=1# 子ノードへ while i!=0: ANS=min(SEG[i],ANS) i>>=1 return ANS def updates(l,r,x): # 区間[l,r)のminを更新. L=l+seg_el R=r+seg_el while L>=1 R>>=1 D=[list(map(int,input().split())) for i in range(N)] if N==1: print(0) exit() for i in range(N): D[i].sort() DP=[0]*M for i in range(N-1): #print("!",DP) SEG=[1<<30]*(2*seg_el) NDP2=[-1]*M TO=D[i+1] for j in range(M): if DP[j]==-1: continue x=D[i][j] k=bisect(TO,x-1) l=bisect(TO,x+DP[j]) while k