Problem: You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). There are two types of brackets: opening and closing. You can replace any bracket by another of the same type. For example, you can replace < by the bracket {, but you can't replace it by ) or >.

The following definition of a regular bracket sequence is well-known, so you can be familiar with it.

Let's define a regular bracket sequence (RBS). Empty string is RBS. Let s1 and s2 be a RBS then the strings <s1>s2, {s1}s2, [s1]s2, (s1)s2 are also RBS.

For example the string "[[(){}]<>]" is RBS, but the strings "[)()" and "][()()" are not.

Determine the least number of replaces to make the string s RBS.

Input

The only line contains a non empty string s, consisting of only opening and closing brackets of four kinds. The length of s does not exceed 106.

Output

If it's impossible to get RBS from s print Impossible.

Otherwise print the least number of replaces needed to get RBS from s.

Examples

Input

[&lt;}){}


Output

2

Input

{()}[]


Output

0

Input

]]


Output

Impossible

Solution (in JAVA):

Solution:
import java.io.*;
import java.math.*;
import java.util.*;

public class RegularBracketSequence {
	static PrintWriter pw;

	static class FastReader {
		private InputStream mIs;
		private byte[] buf = new byte[1024];
		private int curChar, numChars;

		public FastReader() {
			this(System.in);
		}

		public FastReader(InputStream is) {
			mIs = is;
		}

		public int read() {
			if (numChars == -1)
				throw new InputMismatchException();
			if (curChar >= numChars) {
				curChar = 0;
				try {
					numChars = mIs.read(buf);
				} catch (IOException e) {
					throw new InputMismatchException();
				}
				if (numChars <= 0)
					return -1;
			}
			return buf[curChar++];
		}

		public String nextLine() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = read();
			} while (!isEndOfLine(c));
			return res.toString();
		}

		public String next() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			StringBuilder res = new StringBuilder();
			do {
				res.appendCodePoint(c);
				c = read();
			} while (!isSpaceChar(c));
			return res.toString();
		}

		public long l() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			long res = 0;
			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = read();
			} while (!isSpaceChar(c));
			return res * sgn;
		}

		public int i() {
			int c = read();
			while (isSpaceChar(c))
				c = read();
			int sgn = 1;
			if (c == '-') {
				sgn = -1;
				c = read();
			}
			int res = 0;
			do {
				if (c < '0' || c > '9')
					throw new InputMismatchException();
				res *= 10;
				res += c - '0';
				c = read();
			} while (!isSpaceChar(c));
			return res * sgn;
		}

		public double d() throws IOException {
			return Double.parseDouble(next());
		}

		public boolean isSpaceChar(int c) {
			return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
		}

		public boolean isEndOfLine(int c) {
			return c == '\n' || c == '\r' || c == -1;
		}

		public void scanIntArr(int[] arr) {
			for (int li = 0; li < arr.length; ++li)
				arr[li] = i();
		}

		public void scanIntIndexArr(int[] arr) {
			for (int li = 0; li < arr.length; ++li) {
				arr[li] = i() - 1;
			}
		}

		public void printIntArr(int[] arr) {
			for (int li = 0; li < arr.length; ++li)
				pw.print(arr[li] + " ");
			pw.println();
		}

		public void printLongArr(long[] arr) {
			for (int li = 0; li < arr.length; ++li)
				pw.print(arr[li] + " ");
			pw.println();
		}

		public void scanLongArr(long[] arr) {
			for (int i = 0; i < arr.length; ++i) {
				arr[i] = l();
			}
		}

		public void shuffle(int[] arr) {
			for (int i = arr.length; i > 0; --i) {
				int r = (int) (Math.random() * i);
				int temp = arr[i - 1];
				arr[i - 1] = arr[r];
				arr[r] = temp;
			}
		}

		public int findMax(int[] arr) {
			return Arrays.stream(arr).max().getAsInt();
		}
	}

	public static void main(String[] args) throws IOException {
		FastReader fr = new FastReader();
		pw = new PrintWriter(System.out);
		int i, j, n, m, temp, t, ans = 0;
		String s;
		s =fr.nextLine();
		n = s.length();
		Stack<Character> st = new Stack<>();
		if (n == 0) {
			pw.println(0);
		} else {
			for (i = 0; i < n; i++) {
				char ch = s.charAt(i);
				if (ch == '(' || ch == '{' || ch == '[' || ch == '<')
					st.push(ch);
				else {
					if (st.empty())
						break;
					else if (ch == ')' && (st.peek() == '{' || st.peek() == '[' || st.peek() == '<'))
						++ans;
					else if (ch == '}' && (st.peek() == '(' || st.peek() == '[' || st.peek() == '<'))
						++ans;
					else if (ch == ']' && (st.peek() == '{' || st.peek() == '(' || st.peek() == '<'))
						++ans;
					else if (ch == '>' && (st.peek() == '{' || st.peek() == '(' || st.peek() == '['))
						++ans;
					st.pop();
				}
			}
			if ((st.empty() && i < n) || (!st.empty() && i >= n))
				pw.print("Impossible");
			else
				pw.print(ans);
		}
		pw.flush();
		pw.close();
	}
}