#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstring>
#include<string>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector>
#include<bitset>
#include<list>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<ctime>
#include<random>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MAXN=5*1e6+5;
const ll inf=0x3f3f3f3f;
ll n,m,t;
ll fa[MAXN];
vector<ll>a;
vector<ll>b;
vector<ll>c;
vector<ll>a2;
vector<ll>b2;
vector<ll>c2;
ll ans;
int find(int x){
if(fa[x]==x){
return x;
}
else{
return fa[x]=find(fa[x]);
}
}
void merge(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx==fy){
return;
}
fa[fx]=fy;
return;
}
void init(){
a.clear();
b.clear();
c.clear();
a2.clear();
b2.clear();
c2.clear();
ans=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=n;i++){
fa[i]=i;
}
return;
}
bool cmp(int a,int b){
return a>b;
}
void solve(){
for(int i=0;i<a.size();i++){
int ind1=lower_bound(c.begin(),c.end(),a[i])-c.begin();
int ind2=lower_bound(c2.begin(),c2.end(),a[i],greater<int>())-c2.begin();
ll num1=(ind1==c.size()?inf:abs(a[i]-c[ind1]));
ll num2=(ind2==c2.size()?inf:abs(a[i]-c2[ind2]));
if(num1*num1<=num2*num2){
ans=min(ans,num1*num1);
}
else{
ans=min(ans,num2*num2);
}
}
for(int i=0;i<b.size();i++){
int inda1=lower_bound(a.begin(),a.end(),b[i])-a.begin();
int inda2=lower_bound(a2.begin(),a2.end(),b[i],greater<int>())-a2.begin();
int indc1=lower_bound(c.begin(),c.end(),b[i])-c.begin();
int indc2=lower_bound(c2.begin(),c2.end(),b[i],greater<int>())-c2.begin();
ll numa1=(inda1==a.size()?inf:abs(b[i]-a[inda1]));
ll numa2=(inda2==a2.size()?inf:abs(b[i]-a2[inda2]));
ll numc1=(indc1==c.size()?inf:abs(b[i]-c[indc1]));
ll numc2=(indc2==c2.size()?inf:abs(b[i]-c2[indc2]));
if(numa1*numa1<=numa2*numa2){
if(numc1*numc1<=numc2*numc2){
ans=min(ans,numa1*numa1+numc1*numc1);
}
else{
ans=min(ans,numa1*numa1+numc2*numc2);
}
}
else{
if(numc1*numc1<=numc2*numc2){
ans=min(ans,numa2*numa2+numc1*numc1);
}
else{
ans=min(ans,numa2*numa2+numc2*numc2);
}
}
}
return;
}
int main(){
cin>>t;
while(t--){
cin>>n>>m;
init();
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
merge(u,v);
}
if(find(1)==find(n)){
cout<<0<<endl;
continue;
}
for(int i=1;i<=n;i++){
if(find(i)==find(1)){
a.push_back(i);
a2.push_back(i);
}
else if(find(i)==find(n)){
c.push_back(i);
c2.push_back(i);
}
else{
b.push_back(i);
}
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
sort(c.begin(),c.end());
sort(a2.begin(),a2.end(),cmp);
sort(c2.begin(),c2.end(),cmp);
solve();
cout<<ans<<endl;
}
return 0;
}