#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <math.h>
#include <stdio.h>
#include <set>
using namespace std;
int my_max(int a,int b)
{
return a>b?a:b;
}
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> R;
sort(nums.begin(),nums.end());
for(int i =0;i<nums.size();i++) //the limit can be <nums.size().Because while(front<back) can limit it afterwards
{
int front = i+1;
int back = nums.size()-1;
int target = -1*nums[i];
while(front<back)
{
//this way to find the numbers satisy the two sum is worth to be learned
int res = nums[front]+nums[back];
if(res>target)
back--;
else if(res<target)
front++;
else
{
vector<int> aa(3,0);
aa[0] = nums[i];
aa[1] = nums[front];
aa[2] = nums[back];
R.push_back(aa);
//skip the same ones
while(aa[1]==nums[front])front++;
while(aa[2]==nums[back])back--;
}
}
//skip the same ones
while(i+1<nums.size()&&nums[i+1]==nums[i])i++;
}
return R;
}
};
int main()
{
freopen("D:\\input.txt","r",stdin);
int total = 0;
cin>>total;
while(total--)
{
int num = 0;
cin>>num;
vector<int> V;
for(int i = 0;i<num;i++)
{
int m;
cin>>m;
V.push_back(m);
}
Solution solu;
vector<vector<int> > res = solu.threeSum(V);
for(int i = 0;i<res.size();i++)
{
for(int j = 0;j<res[i].size();j++)
{
cout<<res[i][j]<<',';
}
cout<<endl;
}
}
return 0;
}