#include<cstdio>
#include<algorithm>
#include<ctime>
#include<queue>
#include<cstring>
#define N 514
using namespace std;
inline int read(){
int ans=0,sym=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')sym=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ans=ans*10+ch-'0';ch=getchar();}
return ans*sym;
}
int T,n,m,ans,a[N][N];
int vis[N][N];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
bool flg=0;
struct node{
int x,y,h;
bool operator<(const node &a)const{return h>a.h;}
};
priority_queue<node>qq;
int bfs(int x,int y){
queue<pair<int,int> >q;
q.push(make_pair(x,y));
vis[x][y]=1;
while(!q.empty()){
pair<int,int> xx=q.front();q.pop();
if(a[xx.first][xx.second]>a[x][y]){
if(!(xx.first==1||xx.second==1||xx.first==n||xx.second==m))qq.push((node){xx.first,xx.second,a[xx.first][xx.second]});
continue;
}
for(int i=0;i<4;i++){
int tx=xx.first+dx[i];
int ty=xx.second+dy[i];
if(vis[tx][ty])continue;
if(tx>1&&ty>1&&tx<n&&ty<m){
q.push(make_pair(tx,ty));vis[tx][ty]=1;
if(a[tx][ty]>a[x][y])continue;
ans+=a[x][y]-a[tx][ty];
}
}
}
}
signed main(){
scanf("%d",&T);
while(T--){
ans=0;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
while(!qq.empty())qq.pop();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
if(i==1||j==1||i==n||j==m)qq.push((node){i,j,a[i][j]});
}
}
ans=0;
while(!qq.empty()){
int xx=qq.top().x,yy=qq.top().y;
qq.pop();
bfs(xx,yy);
}
printf("%d\n",ans);
}
return 0;
}