#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxN = 1e5+5;
int t, n, m;
int f[maxN];
int find(int v) {
if (f[v] == v) {
return v;
}
f[v] = find(f[v]);
return f[v];
}
void merge(int a, int b) {
int ra = find(a);
int rb = find(b);
if (ra != rb) {
f[ra] = rb;
}
}
ll sqr (int v) {
return (ll) v * v;
}
ll findDist(vector<int> a, vector<int> b) {
ll ret = maxN;
for (int i=0; i<a.size(); i++) {
int left = 0; int right = b.size() - 1;
int pos = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (b[mid] > a[i]) {
pos = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
if (pos == -1) {
ret = min(ret, sqr(a[i] - b[b.size() - 1]));
} else if (pos == 0) {
ret = min(ret, sqr(a[i] - b[0]));
} else {
ll distRight = sqr(a[i] - b[pos]);
ll distLeft = sqr(a[i] - b[pos - 1]);
ret = min(ret, min(distLeft, distRight));
}
}
return ret;
}
void solve() {
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++) {
f[i] = i;
}
for (int i=0; i<m; i++) {
int a, b;
cin >> a >> b;
merge(a, b);
}
vector<int> sets[n+1];
for (int i=1; i<=n; i++) {
sets[find(i)].push_back(i);
}
int root1 = find(1);
int rootn = find(n);
if (root1 == rootn) {
printf("0\n");
return;
}
ll ans = findDist(sets[root1], sets[rootn]);
for (int i=1; i<=n; i++) {
if (i != root1 && i != rootn && sets[i].size() > 0) {
ans = min(ans, findDist(sets[i], sets[root1]) + findDist(sets[i], sets[rootn]));
}
}
printf("%d\n", ans);
}
int main() {
scanf("%d", &t);
for (int ti=0; ti<t; ti++) {
solve();
}
return 0;
}