description: Given a positive integer n. Find three distinct positive integers a, b, c such that a + b + c = n and \operatorname{gcd}(a, b) = c, where \operatorname{gcd}(x, y) denotes the [greatest common divisor (GCD)](https://en.wikipedia.org/wiki/Greatest_common_divisor) of integers x and y.
  
  Input
  
  The input consists of multiple test cases. The first line contains a single integer t (1 ≤ t ≤ 10^5) — the number of test cases. Description of the test cases follows.
  
  The first and only line of each test case contains a single integer n (10 ≤ n ≤ 10^9).
  
  Output
  
  For each test case, output three distinct positive integers a, b, c satisfying the requirements. If there are multiple solutions, you can print any. We can show that an answer always exists.
  
  Example
  
  Input
  
  
  6
  18
  63
  73
  91
  438
  122690412
  
  
  Output
  
  
  6 9 3
  21 39 3
  29 43 1
  49 35 7
  146 219 73
  28622 122661788 2
  
  Note
  
  In the first test case, 6 + 9 + 3 = 18 and \operatorname{gcd}(6, 9) = 3.
  
  In the second test case, 21 + 39 + 3 = 63 and \operatorname{gcd}(21, 39) = 3.
  
  In the third test case, 29 + 43 + 1 = 73 and \operatorname{gcd}(29, 43) = 1.
solution: import java.io.*;
  import java.util.*;
   
  public class _1617b {
      FastScanner scn;
      PrintWriter w;
      PrintStream fs;
  
      long MOD = 1000000007;
      int N=100000+10;
      long mul(long x, long y) {long res = x * y; return (res >= MOD ? res % MOD : res);}
      long power(long x, long y) {if (y < 0) return 1; long res = 1; x %= MOD; while (y!=0) {if ((y & 1)==1)res = mul(res, x); y >>= 1; x = mul(x, x);} return res;}
      void ruffleSort(int[] a) {int n=a.length;Random r=new Random();for (int i=0; i<a.length; i++) {int oi=r.nextInt(n), temp=a[i];a[i]=a[oi];a[oi]=temp;}Arrays.sort(a);}
      void reverseSort(int[] arr){List<Integer> list = new ArrayList<>();for (int i=0; i<arr.length; i++){list.add(arr[i]);}Collections.sort(list, Collections.reverseOrder());for (int i = 0; i < arr.length; i++){arr[i] = list.get(i);}}
      boolean LOCAL;
      void debug(Object... o){if(LOCAL)System.err.println(Arrays.deepToString(o));}
      //SUFFICIENT DRY RUN????LOGIC VERIFIED FOR ALL TEST CASES???
      
      void solve(){
          
          int t=scn.nextInt();
              while(t-->0)
              {
                  int n=scn.nextInt(),temp = n-1;
                  int i = 3;
                  for(i=3;;i++){
                      if(gcd(i, temp-i)==1){
                          w.println(i+" "+(temp-i)+" "+1);
                          break;
                      }
                  }
                  
              }
          
      }
   
      void run() {
          try {
              long ct = System.currentTimeMillis();
              scn = new FastScanner(new File("input.txt"));
              w = new PrintWriter(new File("output.txt"));
              fs=new PrintStream("error.txt");
              System.setErr(fs);
              LOCAL=true;
   
              solve();
   
              w.close();
              System.err.println(System.currentTimeMillis() - ct);
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          }
      }
   
      void runIO() {
   
          scn = new FastScanner(System.in);
          w = new PrintWriter(System.out);
          LOCAL=false;
   
          solve();
   
          w.close();
      }
   
      class FastScanner {
          BufferedReader br;
          StringTokenizer st;
   
          public FastScanner(File f) {
              try {
                  br = new BufferedReader(new FileReader(f));
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              }
          }
   
          public FastScanner(InputStream f) {
              br = new BufferedReader(new InputStreamReader(f));
          }
   
          String next() {
              while (st == null || !st.hasMoreTokens()) {
                  String s = null;
                  try {
                      s = br.readLine();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  if (s == null)
                      return null;
                  st = new StringTokenizer(s);
              }
              return st.nextToken();
          }
   
          boolean hasMoreTokens() {
              while (st == null || !st.hasMoreTokens()) {
                  String s = null;
                  try {
                      s = br.readLine();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  if (s == null)
                      return false;
                  st = new StringTokenizer(s);
              }
              return true;
          }
   
          int nextInt() {
              return Integer.parseInt(next());
          }
          
          int[] nextIntArray(int n) {
              int a[] = new int[n];
              for (int i = 0; i < n; i++) {
                  a[i] = nextInt();
              }
              return a;
          }
  
          long[] nextLongArray(int n) {
              long a[] = new long[n];
              for (int i = 0; i < n; i++) {
                  a[i] = nextLong();
              }
              return a;
          }
  
          long nextLong() {
              return Long.parseLong(next());
          }
   
          double nextDouble() {
              return Double.parseDouble(next());
          }
      }
   
      int lowerBound(int[] arr, int x){int n = arr.length, si = 0, ei = n - 1;while(si <= ei){int mid = si + (ei - si)/2;if(arr[mid] == x){if(mid-1 >= 0 && arr[mid-1] == arr[mid]){ei = mid-1;}else{return mid;}}else if(arr[mid] > x){ei = mid - 1; }else{si = mid+1;}}return si; }
      int upperBound(int[] arr, int x){int n = arr.length, si = 0, ei = n - 1;while(si <= ei){int mid = si + (ei - si)/2;if(arr[mid] == x){if(mid+1 < n && arr[mid+1] == arr[mid]){si = mid+1;}else{return mid + 1;}}else if(arr[mid] > x){ei = mid - 1; }else{si = mid+1;}}return si; }
      int upperBound(ArrayList<Integer> list, int x){int n = list.size(), si = 0, ei = n - 1;while(si <= ei){int mid = si + (ei - si)/2;if(list.get(mid) == x){if(mid+1 < n && list.get(mid+1) == list.get(mid)){si = mid+1;}else{return mid + 1;}}else if(list.get(mid) > x){ei = mid - 1; }else{si = mid+1;}}return si; }
      void swap(int[] arr, int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
      int gcd(int a, int b) {if(a == 0){return b;}return gcd(b%a, a);} // TC- O(logmax(a,b))
      boolean nextPermutation(int[] arr) {if(arr == null || arr.length <= 1){return false;}int last = arr.length-2;while(last >= 0){if(arr[last] < arr[last+1]){break;}last--;}if (last < 0){return false;}if(last >= 0){int nextGreater = arr.length-1;for(int i=arr.length-1; i>last; i--){if(arr[i] > arr[last]){nextGreater = i;break;}}swap(arr, last, nextGreater);}int i = last + 1, j = arr.length - 1;while(i < j){swap(arr, i++, j--);}return true;}
   
      public static void main(String[] args) {
          new _1617b().runIO();
      }
  }
  