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:
//package codeforcesnew;

import java.util.Scanner;

public class ReplaceBrackets {

	char[] start = {'{','(','[','<'};
	char[] end ={'}',')',']','>'};
	char[] array ;
	String s;
	Scanner input;
	
	public ReplaceBrackets(){
	
		input = new Scanner(System.in);
		s = input.next();
		array = new char[s.length()];
		input.close();
		boolean flag = false;
		for(int i=0;i<3;i++) {if(s.charAt(0)==start[i]); flag = true; break;}
		if(flag==true) performStartArr();
		else performEndArr();
	}
	
	public void performStartArr(){
		int head = 0;
		int mismatch = 0;
		
		for(int i=0;i<s.length();i++){
			
		try {
			for(int j=0;j<4;j++){
				if(s.charAt(i)==start[j]){
					array[head]=s.charAt(i);
					head++;
					break;
				}
			}
			
			for(int j=0;j<4;j++){
				if(s.charAt(i)==end[j]){
					if(array[head-1]!=start[j])
					{
						mismatch++;
						array[head-1]=48; //ascii for 0
					    head--;
					    break;
					}else {
						array[head-1]=48; //ascii for 0
						head--;
						break;
					}
				}
			}
		}
		catch(Exception e){
			System.out.println("Impossible");
			return;
		}
		}
		
	if(head==0)System.out.println(mismatch);
	else System.out.println("Impossible");
	}
	
	public void performEndArr(){
		int head = 0;
		int mismatch = 0;
		int balance =0;
		try{
		for(int i=0;i<s.length();i++){
			
			for(int j=0;j<4;j++){
				if(s.charAt(i)==end[j]){
					array[head]=s.charAt(i);
					head++;
					break;
				}
			}
			
			for(int j=0;j<4;j++){
				if(s.charAt(i)==start[j]){
					if(array[head-1]!=end[j])
					{
						mismatch++;
						array[head-1]=48; //ascii for 0
					    head--;
					    break;
					}else {
						array[head-1]=48; //ascii for 0
						head--;
						break;
					}
				}
			}
			
		}
		}
		catch(Exception e){
			System.out.println("Impossible");
			return;
		}
		
		if(head==0)System.out.println(mismatch);
		else System.out.println("Impossible");
	}

	
	public static void main(String args[]){
		new ReplaceBrackets();
	}
}