//题目要求的是每一个点最少要有两条边连接,所以可以先构成一个环。然后再把剩余的最短的边连接起来 #include<iostream> #include<algorithm> using namespace std ; const int N=100010; int n,m; struct edge { int num; int w; } a[N]; int T; bool cmp(edge a,edge b) { return a.w<b.w; } void solve() { int ans=0; for(int i=1; i<=n; i++) { ans+=2*a[i].w; } ans+=(m-n)*(a[1].w+a[2].w); cout<<ans<<endl; for(int i=1; i<n; i++) cout<<i<<" "<<i+1<<endl; cout<<n<<" "<<"1"<<endl; for(int i=1; i<=m-n; i++) cout<<a[1].num<<" "<<a[2].num<<endl; } int main() { cin>>T; while(T--) { cin>>n>>m; for(int i=1; i<=n; i++) { cin>>a[i].w; a[i].num=i; } if(n<=2||m<n) { cout<<"-1"<<endl; continue; } sort(a+1,a+1+n,cmp); solve(); } return 0; }