import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.NoSuchElementException;

public class Main {
	public static void main(String[] args) {
		new Main().solve();
		pw.close();
	}

	/**
	 * ASCII
	 * 0 48
	 * A 65
	 * a 97
	 */

	static PrintWriter pw = new PrintWriter(System.out);

	long MOD = 1_000_000_007;

	void solve() {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	}

	class Data {
		int a;
		int b;
		Data(int a, int b) {
			this.a = a;
			this.b = b;
		}
	}

	class UnionFind {
		int[] parents;
		int[] counts;

		public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		}

		public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		}

		public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		}

		public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		}

		public int count(int a) {
			return counts[find(a)];
		}
	}

	class Combination {
		final int mod;
		final int max;

		final long[] fact;
		final long[] inv;
		final long[] invfact;

		public Combination(int n) {
			this(n, 1_000_000_007);
		}

		public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		}

		public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		}
	}

	public long gcd(long a, long b) {
		if (b == 0) return a;
		else return gcd(b, a%b);
	}

	public void reverse(int[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	public void reverse(long[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	void out(String a) {
		pw.println(a);
	}
	void out(boolean a) {
		pw.println(a);
	}

	void out(int a) {
		pw.println(a);
	}

	void out(long a) {
		pw.println(a);
	}

	void out(double a) {
		pw.println(a);
	}

	void out(char a) {
		pw.println(a);
	}

	void rout(String a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(int a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(long a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(double a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(char a) {
		out(a);
		pw.close();
		System.exit(0);
	}
}


class FastScanner {
    private final InputStream in = System.in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int buflen = 0;
    private boolean hasNextByte() {
        if (ptr < buflen) {
            return true;
        } else {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    }

    private int readByte() {
        if (hasNextByte())
            return buffer[ptr++];
        else
            return -1;
    }

    private boolean isPrintableChar(int c) {
        return 33 <= c && c <= 126;
    }

    public boolean hasNext() {
        while (hasNextByte() && !isPrintableChar(buffer[ptr]))
            ptr++;
        return hasNextByte();
    }

    public String next() {
        if (!hasNext())
            throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while (isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    public long nextLong() {
        if (!hasNext())
            throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while (true) {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        }
    }

    public int nextInt() {
        long nl = nextLong();
        if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
            throw new NumberFormatException();
        return (int) nl;
    }

    public double nextDouble() {
        return Double.parseDouble(next());
    }
} import java.io.IOException; IOException java.io import java.io.InputStream; InputStream java.io import java.io.PrintWriter; PrintWriter java.io import java.util.NoSuchElementException; NoSuchElementException java.util public class Main {
	public static void main(String[] args) {
		new Main().solve();
		pw.close();
	}

	/**
	 * ASCII
	 * 0 48
	 * A 65
	 * a 97
	 */

	static PrintWriter pw = new PrintWriter(System.out);

	long MOD = 1_000_000_007;

	void solve() {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	}

	class Data {
		int a;
		int b;
		Data(int a, int b) {
			this.a = a;
			this.b = b;
		}
	}

	class UnionFind {
		int[] parents;
		int[] counts;

		public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		}

		public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		}

		public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		}

		public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		}

		public int count(int a) {
			return counts[find(a)];
		}
	}

	class Combination {
		final int mod;
		final int max;

		final long[] fact;
		final long[] inv;
		final long[] invfact;

		public Combination(int n) {
			this(n, 1_000_000_007);
		}

		public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		}

		public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		}
	}

	public long gcd(long a, long b) {
		if (b == 0) return a;
		else return gcd(b, a%b);
	}

	public void reverse(int[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	public void reverse(long[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	void out(String a) {
		pw.println(a);
	}
	void out(boolean a) {
		pw.println(a);
	}

	void out(int a) {
		pw.println(a);
	}

	void out(long a) {
		pw.println(a);
	}

	void out(double a) {
		pw.println(a);
	}

	void out(char a) {
		pw.println(a);
	}

	void rout(String a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(int a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(long a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(double a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(char a) {
		out(a);
		pw.close();
		System.exit(0);
	}
} Main /**
	 * ASCII
	 * 0 48
	 * A 65
	 * a 97
	 */

	static PrintWriter pw = new PrintWriter(System.out); pw new PrintWriter(System.out) long MOD = 1_000_000_007; MOD 1_000_000_007 public static void main(String[] args) {
		new Main().solve();
		pw.close();
	} main {
		new Main().solve();
		pw.close();
	} new Main().solve() new Main().solve new Main() pw.close() pw.close pw String[] args args void solve() {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	} solve {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	} FastScanner sc = new FastScanner(); sc new FastScanner() String s = sc.next(); s sc.next() sc.next sc for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		} int i = 0; int i = 0; i 0 i < 1 << 3 i 1 << 3 1 3 i++ i++ i {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		} {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		} int sum = s.charAt(0) - '0'; sum s.charAt(0) - '0' s.charAt(0) s.charAt s 0 '0' StringBuilder sb = new StringBuilder(s); sb new StringBuilder(s) for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			} int j = 0; int j = 0; j 0 j < 3 j 3 j++ j++ j {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			} {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			} if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				} (i >> j & 1) == 1 (i >> j & 1) i >> j i j 1 1 {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} sum += s.charAt(j+1) - '0' sum s.charAt(j+1) - '0' s.charAt(j+1) s.charAt s j+1 j 1 '0' sb.insert(j*2+1, "+") sb.insert sb j*2+1 j*2 j 2 1 "+" {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				} sum -= s.charAt(j+1) - '0' sum s.charAt(j+1) - '0' s.charAt(j+1) s.charAt s j+1 j 1 '0' sb.insert(j*2+1, "-") sb.insert sb j*2+1 j*2 j 2 1 "-" if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			} sum == 7 sum 7 {
				sb.append("=7");
				rout(sb.toString());
			} sb.append("=7") sb.append sb "=7" rout(sb.toString()) rout sb.toString() sb.toString sb public long gcd(long a, long b) {
		if (b == 0) return a;
		else return gcd(b, a%b);
	} gcd {
		if (b == 0) return a;
		else return gcd(b, a%b);
	} if (b == 0) return a;
		else return gcd(b, a%b); b == 0 b 0 return a; a return gcd(b, a%b); gcd(b, a%b) gcd b a%b a b long a a long b b public void reverse(int[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	} reverse {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	} int last = a.length-1; last a.length-1 a.length a a.length 1 int n = a.length / 2; n a.length / 2 a.length a a.length 2 for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		} int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		} {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		} int t = a[i]; t a[i] a i a[i] = a[last-i] a[i] a i a[last-i] a last-i last i a[last-i] = t a[last-i] a last-i last i t int[] a a public void reverse(long[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	} reverse {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	} int last = a.length-1; last a.length-1 a.length a a.length 1 int n = a.length / 2; n a.length / 2 a.length a a.length 2 for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		} int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		} {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		} long t = a[i]; t a[i] a i a[i] = a[last-i] a[i] a i a[last-i] a last-i last i a[last-i] = t a[last-i] a last-i last i t long[] a a void out(String a) {
		pw.println(a);
	} out {
		pw.println(a);
	} pw.println(a) pw.println pw a String a a void out(boolean a) {
		pw.println(a);
	} out {
		pw.println(a);
	} pw.println(a) pw.println pw a boolean a a void out(int a) {
		pw.println(a);
	} out {
		pw.println(a);
	} pw.println(a) pw.println pw a int a a void out(long a) {
		pw.println(a);
	} out {
		pw.println(a);
	} pw.println(a) pw.println pw a long a a void out(double a) {
		pw.println(a);
	} out {
		pw.println(a);
	} pw.println(a) pw.println pw a double a a void out(char a) {
		pw.println(a);
	} out {
		pw.println(a);
	} pw.println(a) pw.println pw a char a a void rout(String a) {
		out(a);
		pw.close();
		System.exit(0);
	} rout {
		out(a);
		pw.close();
		System.exit(0);
	} out(a) out a pw.close() pw.close pw System.exit(0) System.exit System 0 String a a void rout(int a) {
		out(a);
		pw.close();
		System.exit(0);
	} rout {
		out(a);
		pw.close();
		System.exit(0);
	} out(a) out a pw.close() pw.close pw System.exit(0) System.exit System 0 int a a void rout(long a) {
		out(a);
		pw.close();
		System.exit(0);
	} rout {
		out(a);
		pw.close();
		System.exit(0);
	} out(a) out a pw.close() pw.close pw System.exit(0) System.exit System 0 long a a void rout(double a) {
		out(a);
		pw.close();
		System.exit(0);
	} rout {
		out(a);
		pw.close();
		System.exit(0);
	} out(a) out a pw.close() pw.close pw System.exit(0) System.exit System 0 double a a void rout(char a) {
		out(a);
		pw.close();
		System.exit(0);
	} rout {
		out(a);
		pw.close();
		System.exit(0);
	} out(a) out a pw.close() pw.close pw System.exit(0) System.exit System 0 char a a class Data {
		int a;
		int b;
		Data(int a, int b) {
			this.a = a;
			this.b = b;
		}
	} Data int a; a int b; b Data(int a, int b) {
			this.a = a;
			this.b = b;
		} Data {
			this.a = a;
			this.b = b;
		} this.a = a this.a this this.a a this.b = b this.b this this.b b int a a int b b class UnionFind {
		int[] parents;
		int[] counts;

		public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		}

		public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		}

		public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		}

		public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		}

		public int count(int a) {
			return counts[find(a)];
		}
	} UnionFind int[] parents; parents int[] counts; counts public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		} UnionFind {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		} parents = new int[size] parents new int[size] size counts = new int[size] counts new int[size] size for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			} int i = 0; int i = 0; i 0 i < size i size i++ i++ i {
				parents[i] = i;
				counts[i] = 1;
			} {
				parents[i] = i;
				counts[i] = 1;
			} parents[i] = i parents[i] parents i i counts[i] = 1 counts[i] counts i 1 int size size public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		} find {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		} if (parents[a] == a) return a; parents[a] == a parents[a] parents a a return a; a parents[a] = find(parents[a]) parents[a] parents a find(parents[a]) find parents[a] parents a return parents[a]; parents[a] parents a int a a public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		} unite {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		} a = find(a) a find(a) find a b = find(b) b find(b) find b if (a == b) return; a == b a b return; if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			} counts[a] < counts[b] counts[a] counts a counts[b] counts b {
				parents[a] = b;
				counts[b] += counts[a];
			} parents[a] = b parents[a] parents a b counts[b] += counts[a] counts[b] counts b counts[a] counts a {
				parents[b] = a;
				counts[a] += counts[b];
			} parents[b] = a parents[b] parents b a counts[a] += counts[b] counts[a] counts a counts[b] counts b int a a int b b public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		} differ {
			a = find(a);
			b = find(b);
			return a != b;
		} a = find(a) a find(a) find a b = find(b) b find(b) find b return a != b; a != b a b int a a int b b public int count(int a) {
			return counts[find(a)];
		} count {
			return counts[find(a)];
		} return counts[find(a)]; counts[find(a)] counts find(a) find a int a a class Combination {
		final int mod;
		final int max;

		final long[] fact;
		final long[] inv;
		final long[] invfact;

		public Combination(int n) {
			this(n, 1_000_000_007);
		}

		public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		}

		public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		}
	} Combination final int mod; mod final int max; max final long[] fact; fact final long[] inv; inv final long[] invfact; invfact public Combination(int n) {
			this(n, 1_000_000_007);
		} Combination {
			this(n, 1_000_000_007);
		} this(n, 1_000_000_007) this n 1_000_000_007 int n n public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		} Combination {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		} this.mod = mod this.mod this this.mod mod max = n + 1 max n + 1 n 1 fact = new long[max] fact new long[max] max invfact = new long[max] invfact new long[max] max inv = new long[max] inv new long[max] max inv[1] = 1 inv[1] inv 1 1 for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			} int i = 2; int i = 2; i 2 i < inv.length i inv.length inv inv.length i++ i++ i {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			} {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			} inv[i] = inv[mod % i] * (mod - mod / i) % mod inv[i] inv i inv[mod % i] * (mod - mod / i) % mod inv[mod % i] * (mod - mod / i) inv[mod % i] inv mod % i mod i (mod - mod / i) mod mod / i mod i mod fact[0] = 1 fact[0] fact 0 1 invfact[0] = 1 invfact[0] invfact 0 1 for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			} int i = 1; int i = 1; i 1 i < inv.length i inv.length inv inv.length i++ i++ i {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			} {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			} fact[i] = i * fact[i - 1] % mod fact[i] fact i i * fact[i - 1] % mod i * fact[i - 1] i fact[i - 1] fact i - 1 i 1 mod invfact[i] = inv[i] * invfact[i - 1] % mod invfact[i] invfact i inv[i] * invfact[i - 1] % mod inv[i] * invfact[i - 1] inv[i] inv i invfact[i - 1] invfact i - 1 i 1 mod int n n int mod mod public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		} get {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		} return fact[n] * invfact[n - r] % mod * invfact[r] % mod; fact[n] * invfact[n - r] % mod * invfact[r] % mod fact[n] * invfact[n - r] % mod * invfact[r] fact[n] * invfact[n - r] % mod fact[n] * invfact[n - r] fact[n] fact n invfact[n - r] invfact n - r n r mod invfact[r] invfact r mod int n n int r r class FastScanner {
    private final InputStream in = System.in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int buflen = 0;
    private boolean hasNextByte() {
        if (ptr < buflen) {
            return true;
        } else {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    }

    private int readByte() {
        if (hasNextByte())
            return buffer[ptr++];
        else
            return -1;
    }

    private boolean isPrintableChar(int c) {
        return 33 <= c && c <= 126;
    }

    public boolean hasNext() {
        while (hasNextByte() && !isPrintableChar(buffer[ptr]))
            ptr++;
        return hasNextByte();
    }

    public String next() {
        if (!hasNext())
            throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while (isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    public long nextLong() {
        if (!hasNext())
            throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while (true) {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        }
    }

    public int nextInt() {
        long nl = nextLong();
        if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
            throw new NumberFormatException();
        return (int) nl;
    }

    public double nextDouble() {
        return Double.parseDouble(next());
    }
} FastScanner private final InputStream in = System.in; in System.in System System.in private final byte[] buffer = new byte[1024]; buffer new byte[1024] 1024 private int ptr = 0; ptr 0 private int buflen = 0; buflen 0 private boolean hasNextByte() {
        if (ptr < buflen) {
            return true;
        } else {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    } hasNextByte {
        if (ptr < buflen) {
            return true;
        } else {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    } if (ptr < buflen) {
            return true;
        } else {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        } ptr < buflen ptr buflen {
            return true;
        } return true; true {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        } ptr = 0 ptr 0 try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } IOException e {
                e.printStackTrace();
            } e.printStackTrace() e.printStackTrace e {
                buflen = in.read(buffer);
            } buflen = in.read(buffer) buflen in.read(buffer) in.read in buffer if (buflen <= 0) {
                return false;
            } buflen <= 0 buflen 0 {
                return false;
            } return false; false return true; true private int readByte() {
        if (hasNextByte())
            return buffer[ptr++];
        else
            return -1;
    } readByte {
        if (hasNextByte())
            return buffer[ptr++];
        else
            return -1;
    } if (hasNextByte())
            return buffer[ptr++];
        else
            return -1; hasNextByte() hasNextByte return buffer[ptr++]; buffer[ptr++] buffer ptr++ ptr return -1; -1 1 private boolean isPrintableChar(int c) {
        return 33 <= c && c <= 126;
    } isPrintableChar {
        return 33 <= c && c <= 126;
    } return 33 <= c && c <= 126; 33 <= c && c <= 126 33 <= c 33 c c <= 126 c 126 int c c public boolean hasNext() {
        while (hasNextByte() && !isPrintableChar(buffer[ptr]))
            ptr++;
        return hasNextByte();
    } hasNext {
        while (hasNextByte() && !isPrintableChar(buffer[ptr]))
            ptr++;
        return hasNextByte();
    } while (hasNextByte() && !isPrintableChar(buffer[ptr]))
            ptr++; hasNextByte() && !isPrintableChar(buffer[ptr]) hasNextByte() hasNextByte !isPrintableChar(buffer[ptr]) isPrintableChar(buffer[ptr]) isPrintableChar buffer[ptr] buffer ptr ptr++ ptr return hasNextByte(); hasNextByte() hasNextByte public String next() {
        if (!hasNext())
            throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while (isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    } next {
        if (!hasNext())
            throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while (isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    } if (!hasNext())
            throw new NoSuchElementException(); !hasNext() hasNext() hasNext throw new NoSuchElementException(); new NoSuchElementException() StringBuilder sb = new StringBuilder(); sb new StringBuilder() int b = readByte(); b readByte() readByte while (isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        } isPrintableChar(b) isPrintableChar b {
            sb.appendCodePoint(b);
            b = readByte();
        } sb.appendCodePoint(b) sb.appendCodePoint sb b b = readByte() b readByte() readByte return sb.toString(); sb.toString() sb.toString sb public long nextLong() {
        if (!hasNext())
            throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while (true) {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        }
    } nextLong {
        if (!hasNext())
            throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while (true) {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        }
    } if (!hasNext())
            throw new NoSuchElementException(); !hasNext() hasNext() hasNext throw new NoSuchElementException(); new NoSuchElementException() long n = 0; n 0 boolean minus = false; minus false int b = readByte(); b readByte() readByte if (b == '-') {
            minus = true;
            b = readByte();
        } b == '-' b '-' {
            minus = true;
            b = readByte();
        } minus = true minus true b = readByte() b readByte() readByte if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        } b < '0' || '9' < b b < '0' b '0' '9' < b '9' b {
            throw new NumberFormatException();
        } throw new NumberFormatException(); new NumberFormatException() while (true) {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        } true {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        } if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            } '0' <= b && b <= '9' '0' <= b '0' b b <= '9' b '9' {
                n *= 10;
                n += b - '0';
            } n *= 10 n 10 n += b - '0' n b - '0' b '0' if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            } b == -1 || !isPrintableChar(b) b == -1 b -1 1 !isPrintableChar(b) isPrintableChar(b) isPrintableChar b {
                return minus ? -n : n;
            } return minus ? -n : n; minus ? -n : n minus -n n n {
                throw new NumberFormatException();
            } throw new NumberFormatException(); new NumberFormatException() b = readByte() b readByte() readByte public int nextInt() {
        long nl = nextLong();
        if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
            throw new NumberFormatException();
        return (int) nl;
    } nextInt {
        long nl = nextLong();
        if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
            throw new NumberFormatException();
        return (int) nl;
    } long nl = nextLong(); nl nextLong() nextLong if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
            throw new NumberFormatException(); nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE nl < Integer.MIN_VALUE nl Integer.MIN_VALUE Integer Integer.MIN_VALUE nl > Integer.MAX_VALUE nl Integer.MAX_VALUE Integer Integer.MAX_VALUE throw new NumberFormatException(); new NumberFormatException() return (int) nl; (int) nl public double nextDouble() {
        return Double.parseDouble(next());
    } nextDouble {
        return Double.parseDouble(next());
    } return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next public class Main {
	public static void main(String[] args) {
		new Main().solve();
		pw.close();
	}

	/**
	 * ASCII
	 * 0 48
	 * A 65
	 * a 97
	 */

	static PrintWriter pw = new PrintWriter(System.out);

	long MOD = 1_000_000_007;

	void solve() {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	}

	class Data {
		int a;
		int b;
		Data(int a, int b) {
			this.a = a;
			this.b = b;
		}
	}

	class UnionFind {
		int[] parents;
		int[] counts;

		public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		}

		public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		}

		public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		}

		public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		}

		public int count(int a) {
			return counts[find(a)];
		}
	}

	class Combination {
		final int mod;
		final int max;

		final long[] fact;
		final long[] inv;
		final long[] invfact;

		public Combination(int n) {
			this(n, 1_000_000_007);
		}

		public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		}

		public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		}
	}

	public long gcd(long a, long b) {
		if (b == 0) return a;
		else return gcd(b, a%b);
	}

	public void reverse(int[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	public void reverse(long[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	void out(String a) {
		pw.println(a);
	}
	void out(boolean a) {
		pw.println(a);
	}

	void out(int a) {
		pw.println(a);
	}

	void out(long a) {
		pw.println(a);
	}

	void out(double a) {
		pw.println(a);
	}

	void out(char a) {
		pw.println(a);
	}

	void rout(String a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(int a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(long a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(double a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(char a) {
		out(a);
		pw.close();
		System.exit(0);
	}
} public class Main {
	public static void main(String[] args) {
		new Main().solve();
		pw.close();
	}

	/**
	 * ASCII
	 * 0 48
	 * A 65
	 * a 97
	 */

	static PrintWriter pw = new PrintWriter(System.out);

	long MOD = 1_000_000_007;

	void solve() {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	}

	class Data {
		int a;
		int b;
		Data(int a, int b) {
			this.a = a;
			this.b = b;
		}
	}

	class UnionFind {
		int[] parents;
		int[] counts;

		public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		}

		public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		}

		public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		}

		public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		}

		public int count(int a) {
			return counts[find(a)];
		}
	}

	class Combination {
		final int mod;
		final int max;

		final long[] fact;
		final long[] inv;
		final long[] invfact;

		public Combination(int n) {
			this(n, 1_000_000_007);
		}

		public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		}

		public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		}
	}

	public long gcd(long a, long b) {
		if (b == 0) return a;
		else return gcd(b, a%b);
	}

	public void reverse(int[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	public void reverse(long[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	void out(String a) {
		pw.println(a);
	}
	void out(boolean a) {
		pw.println(a);
	}

	void out(int a) {
		pw.println(a);
	}

	void out(long a) {
		pw.println(a);
	}

	void out(double a) {
		pw.println(a);
	}

	void out(char a) {
		pw.println(a);
	}

	void rout(String a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(int a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(long a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(double a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(char a) {
		out(a);
		pw.close();
		System.exit(0);
	}
} Main
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.NoSuchElementException;

public class Main {
	public static void main(String[] args) {
		new Main().solve();
		pw.close();
	}

	/**
	 * ASCII
	 * 0 48
	 * A 65
	 * a 97
	 */

	static PrintWriter pw = new PrintWriter(System.out);

	long MOD = 1_000_000_007;

	void solve() {
		FastScanner sc = new FastScanner();
		String s = sc.next();
		for (int i = 0; i < 1 << 3; i++) {
			int sum = s.charAt(0) - '0';
			StringBuilder sb = new StringBuilder(s);
			for (int j = 0; j < 3; j++) {
				if ((i >> j & 1) == 1) {
					sum += s.charAt(j+1) - '0';
					sb.insert(j*2+1, "+");
				} else {
					sum -= s.charAt(j+1) - '0';
					sb.insert(j*2+1, "-");
				}
			}
			if (sum == 7) {
				sb.append("=7");
				rout(sb.toString());
			}
		}
	}

	class Data {
		int a;
		int b;
		Data(int a, int b) {
			this.a = a;
			this.b = b;
		}
	}

	class UnionFind {
		int[] parents;
		int[] counts;

		public UnionFind(int size) {
			parents = new int[size];
			counts = new int[size];
			for (int i = 0; i < size; i++) {
				parents[i] = i;
				counts[i] = 1;
			}
		}

		public int find(int a) {
			if (parents[a] == a) return a;
			parents[a] = find(parents[a]);
			return parents[a];
		}

		public void unite(int a, int b) {
			a = find(a);
			b = find(b);
			if (a == b) return;
			if (counts[a] < counts[b]) {
				parents[a] = b;
				counts[b] += counts[a];
			} else {
				parents[b] = a;
				counts[a] += counts[b];
			}
		}

		public boolean differ(int a, int b) {
			a = find(a);
			b = find(b);
			return a != b;
		}

		public int count(int a) {
			return counts[find(a)];
		}
	}

	class Combination {
		final int mod;
		final int max;

		final long[] fact;
		final long[] inv;
		final long[] invfact;

		public Combination(int n) {
			this(n, 1_000_000_007);
		}

		public Combination(int n, int mod) {
			this.mod = mod;
			max = n + 1;
			fact = new long[max];
			invfact = new long[max];
			inv = new long[max];

			inv[1] = 1;
			for (int i = 2; i < inv.length; i++) {
				inv[i] = inv[mod % i] * (mod - mod / i) % mod;
			}

			fact[0] = 1;
			invfact[0] = 1;
			for (int i = 1; i < inv.length; i++) {
				fact[i] = i * fact[i - 1] % mod;
				invfact[i] = inv[i] * invfact[i - 1] % mod;
			}
		}

		public long get(int n, int r) {
			return fact[n] * invfact[n - r] % mod * invfact[r] % mod;
		}
	}

	public long gcd(long a, long b) {
		if (b == 0) return a;
		else return gcd(b, a%b);
	}

	public void reverse(int[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			int t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	public void reverse(long[] a) {
		int last = a.length-1;
		int n = a.length / 2;
		for (int i = 0; i < n; i++) {
			long t = a[i];
			a[i] = a[last-i];
			a[last-i] = t;
		}
	}

	void out(String a) {
		pw.println(a);
	}
	void out(boolean a) {
		pw.println(a);
	}

	void out(int a) {
		pw.println(a);
	}

	void out(long a) {
		pw.println(a);
	}

	void out(double a) {
		pw.println(a);
	}

	void out(char a) {
		pw.println(a);
	}

	void rout(String a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(int a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(long a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(double a) {
		out(a);
		pw.close();
		System.exit(0);
	}
	void rout(char a) {
		out(a);
		pw.close();
		System.exit(0);
	}
}


class FastScanner {
    private final InputStream in = System.in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int buflen = 0;
    private boolean hasNextByte() {
        if (ptr < buflen) {
            return true;
        } else {
            ptr = 0;
            try {
                buflen = in.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (buflen <= 0) {
                return false;
            }
        }
        return true;
    }

    private int readByte() {
        if (hasNextByte())
            return buffer[ptr++];
        else
            return -1;
    }

    private boolean isPrintableChar(int c) {
        return 33 <= c && c <= 126;
    }

    public boolean hasNext() {
        while (hasNextByte() && !isPrintableChar(buffer[ptr]))
            ptr++;
        return hasNextByte();
    }

    public String next() {
        if (!hasNext())
            throw new NoSuchElementException();
        StringBuilder sb = new StringBuilder();
        int b = readByte();
        while (isPrintableChar(b)) {
            sb.appendCodePoint(b);
            b = readByte();
        }
        return sb.toString();
    }

    public long nextLong() {
        if (!hasNext())
            throw new NoSuchElementException();
        long n = 0;
        boolean minus = false;
        int b = readByte();
        if (b == '-') {
            minus = true;
            b = readByte();
        }
        if (b < '0' || '9' < b) {
            throw new NumberFormatException();
        }
        while (true) {
            if ('0' <= b && b <= '9') {
                n *= 10;
                n += b - '0';
            } else if (b == -1 || !isPrintableChar(b)) {
                return minus ? -n : n;
            } else {
                throw new NumberFormatException();
            }
            b = readByte();
        }
    }

    public int nextInt() {
        long nl = nextLong();
        if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
            throw new NumberFormatException();
        return (int) nl;
    }

    public double nextDouble() {
        return Double.parseDouble(next());
    }
}
