int read(){
char c;while(c=getchar(),(c<'0'||c>'9')&&c!='-');int x=0,y=1;
if(c=='-') y=-1;else x=c-'0';
while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';
return x*y;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
if(i!=k&&f[i][k]!=maxn)
for(int j=1;j<=n;j++)
if(i!=j&&j!=k&&f[k][j]!=maxn)
f[i][j]=max(f[i][j],f[i][k]+f[k][j]);
for(int i=1;i<=m;i++){
if(find(x)!=find(y)){
unionn(x,y);k++;
}
if(k==n-1) break;
}
int find(int x){
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
int unionn(int x,int y){
x=find(x);y=find(y);
if(x>y) fa[x]=y;
else fa[y]=x;
}
void up(int node){sum[node]=sum[node<<1]+sum[(node<<1)+1];}
void down(int node,int l_L,int l_R){
if(add[node]){
add[node<<1]+=add[node];
add[(node<<1)+1]+=add[node];
sum[node<<1]+=l_L*add[node];
sum[(node<<1)+1]+=l_R*add[node];
add[node]=0;
}
}
void build(int node,int l,int r){
if(l==r){
sum[node]=f[l];
return;
}
int mid=(l+r)>>1;
build(node<<1,l,mid);
build((node<<1)+1,mid+1,r);
up(node);
}
void updateONE(int node,int l,int r,int p,int ad){
if(l==r){
sum[node]+=ad;
return;
}
int mid=(l+r)>>1;
if(p<=mid) updateONE(node<<1,l,mid,p,ad);
else updateONE((node<<1)+1,mid+1,r,p,ad);
up(node);
}
void updateMORE(int node,int l,int r,int LS,int RS,int ad){
if(LS<=l&&r<=RS){
sum[node]+=(r-l+1)*ad;
add[node]+=add;
return;
}
int mid=(l+r)>>1;
down(node,mid-l+1,r-mid);
if(LS<=mid) updateMORE(node<<1,l,mid,LS,RS,ad);
if(RS>=mid+1) updateMORE((node<<1)+1,mid+1,r,LS,RS,ad);
up(node);
}
void query(int node,int l,int r,int LS,int RS){
if(LS<=l&&r<=RS){
return sum[node];
}
int mid=(l+r)>>1;
down(node,mid-l+1,r-mid);
int ans=0;
if(LS<=mid) ans+=query(node<<1,l,mid,LS,RS);
if(RS>=mid+1) ans+=query((node<<1)+1,mid+1,r,LS,RS);
return ans;
}