#include <bits/stdc++.h>
using namespace std;
struct FASTINPUT {
  void f(string& s) {
    char buf[400005];
    long long a = scanf("%s", buf);
    a++;
    s = buf;
  }
  void f(long long& x) {
    long long a = scanf("%lld", &x);
    a++;
  }
  void f(int& x) {
    long long a = scanf("%d", &x);
    a++;
  }
  void f(double& x) {
    long long a = scanf("%lf", &x);
    a++;
  }
  template <typename A, typename B>
  void f(pair<A, B>& p) {
    f(p.first);
    f(p.second);
  }
  template <typename A>
  void f(vector<A>& x) {
    for (auto& y : x) f(y);
  }
  void read() {}
  template <typename Head, typename... Tail>
  void read(Head& H, Tail&... T) {
    f(H);
    read(T...);
  }
};
struct FASTOUTPUT {
  void f(string s) { printf("%s", s.c_str()); }
  void f(long long x) { printf("%lld", x); }
  void f(int x) { printf("%d", x); }
  void f(double x) { printf("%.20f", x); }
  void f(char x) { printf("%c", x); }
  void f(const char* a) { printf("%s", a); }
  template <typename A>
  void f(vector<A>& x) {
    for (auto& y : x) {
      f(y);
      f(" ");
    }
  }
  void print() {}
  template <typename Head, typename... Tail>
  void print(Head H, Tail... T) {
    f(H);
    print(T...);
  }
};
struct DEBUG {
  string open = "[", close = "]", sep = ", ";
  string f(string s) { return s; }
  string f(char c) { return string(1, c); }
  string f(int x) { return to_string(x); }
  string f(long long x) { return to_string(x); }
  string f(double x) { return to_string(x); }
  string f(const char* a) { return a; }
  template <typename A, typename B>
  string f(pair<A, B> p) {
    return open + f(p.first) + sep + f(p.second) + close;
  }
  template <typename A>
  string f(A v) {
    string s = open;
    for (auto a : v) {
      if (s != open) {
        s += sep;
      }
      s += f(a);
    }
    s += close;
    return s;
  }
  void show() { cout << endl; }
  template <typename Head, typename... Tail>
  void show(Head H, Tail... T) {
    cout << " " << f(H);
    show(T...);
  }
};
vector<long long> di = {0, 0, 1, -1, 1, -1, 1, -1};
vector<long long> dj = {1, -1, 0, 0, -1, -1, 1, 1};
long long ob(long long i, long long n) { return i < 0 || i >= n; }
long long tp(long long x) { return (1LL << x); }
long long roundup(long long a, long long b) {
  return a % b ? a / b + 1 : a / b;
}
template <typename A, typename B>
long long exist(A a, B b) {
  return a.find(b) != a.end();
}
vector<string> ssplit(string s) {
  vector<string> ans;
  stringstream ss;
  ss << s;
  while (ss >> s) ans.push_back(s);
  return ans;
}
void makemod(long long& x, long long m) {
  x %= m;
  x += m;
  x %= m;
}
long long powmod(long long a, long long b, long long m) {
  if (b == 0) return 1;
  long long h = powmod(a, b / 2, m);
  long long ans = h * h % m;
  return b % 2 ? ans * a % m : ans;
}
bool isvowel(char ch) {
  return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u');
}
long long sign(long long x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
void upmin(long long& x, long long v) { x = min(x, v); }
void upmax(long long& x, long long v) { x = max(x, v); }
const vector<long long> mods = {(long long)1e9 + 7, 998244353,
                                (long long)1e6 + 3, (long long)1e18 + 5};
const long long mod = mods[0];
const long long inf = mods[3];
const double eps = 1e-10;
const double pi = acos(0) * 2;
const string nl = "\n";
long long ok = 1;
void dfs(long long at, long long cur, vector<long long>& col,
         vector<vector<long long> >& adj) {
  col[at] = cur;
  for (auto to : adj[at]) {
    if (col[to] == cur) {
      ok = 0;
      return;
    } else if (col[to] == -1) {
      dfs(to, !cur, col, adj);
    }
  }
}
void solve() {
  long long n, m;
  do {
    FASTINPUT inp;
    inp.read(n, m);
  } while (false);
  vector<vector<long long> > E(m, vector<long long>(2));
  do {
    FASTINPUT inp;
    inp.read(E);
  } while (false);
  vector<vector<long long> > adj(m);
  for (long long i = 0; i < m; i++) {
    for (long long j = i + 1; j < m; j++) {
      set<long long> S;
      for (long long x = 0; x < 2; x++) {
        S.insert(E[i][x]);
        S.insert(E[j][x]);
      }
      if (S.size() != 4) continue;
      long long lo = E[i][0], hi = E[i][1];
      if (lo > hi) swap(lo, hi);
      long long cnt = 0;
      for (long long x = 0; x < 2; x++) {
        cnt += (E[j][x] >= lo && E[j][x] <= hi);
      }
      if (cnt == 1) {
        adj[i].push_back(j);
        adj[j].push_back(i);
      }
    }
  }
  vector<long long> col(m, -1);
  for (long long i = 0; i < m; i++) {
    if (col[i] == -1) dfs(i, 0, col, adj);
  }
  if (!ok) {
    do {
      FASTOUTPUT out;
      out.print("Impossible", nl);
    } while (false);
  } else {
    for (long long i = 0; i < m; i++) {
      if (col[i] == 0) do {
          FASTOUTPUT out;
          out.print('i');
        } while (false);
      else
        do {
          FASTOUTPUT out;
          out.print('o');
        } while (false);
    }
    do {
      FASTOUTPUT out;
      out.print(nl);
    } while (false);
  }
}
signed main() {
  long long t = 1;
  for (long long i = 0; i < t; i++) solve();
  return 0;
}

### Prompt

Generate a CPP solution to the following problem:

It is well known that Berland has n cities, which form the Silver ring — cities i and i + 1 (1 ≤ i < n) are connected by a road, as well as the cities n and 1. The goverment have decided to build m new roads. The list of the roads to build was prepared. Each road will connect two cities. Each road should be a curve which lies inside or outside the ring. New roads will have no common points with the ring (except the endpoints of the road).

Now the designers of the constructing plan wonder if it is possible to build the roads in such a way that no two roads intersect (note that the roads may intersect at their endpoints). If it is possible to do, which roads should be inside the ring, and which should be outside?

Input

The first line contains two integers n and m (4 ≤ n ≤ 100, 1 ≤ m ≤ 100). Each of the following m lines contains two integers ai and bi (1 ≤ ai, bi ≤ n, ai ≠ bi). No two cities will be connected by more than one road in the list. The list will not contain the roads which exist in the Silver ring.

Output

If it is impossible to build the roads in such a way that no two roads intersect, output Impossible. Otherwise print m characters. i-th character should be i, if the road should be inside the ring, and o if the road should be outside the ring. If there are several solutions, output any of them.

Examples

Input

4 2
1 3
2 4


Output

io


Input

6 3
1 3
3 5
5 1


Output

ooo

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
struct FASTINPUT {
  void f(string& s) {
    char buf[400005];
    long long a = scanf("%s", buf);
    a++;
    s = buf;
  }
  void f(long long& x) {
    long long a = scanf("%lld", &x);
    a++;
  }
  void f(int& x) {
    long long a = scanf("%d", &x);
    a++;
  }
  void f(double& x) {
    long long a = scanf("%lf", &x);
    a++;
  }
  template <typename A, typename B>
  void f(pair<A, B>& p) {
    f(p.first);
    f(p.second);
  }
  template <typename A>
  void f(vector<A>& x) {
    for (auto& y : x) f(y);
  }
  void read() {}
  template <typename Head, typename... Tail>
  void read(Head& H, Tail&... T) {
    f(H);
    read(T...);
  }
};
struct FASTOUTPUT {
  void f(string s) { printf("%s", s.c_str()); }
  void f(long long x) { printf("%lld", x); }
  void f(int x) { printf("%d", x); }
  void f(double x) { printf("%.20f", x); }
  void f(char x) { printf("%c", x); }
  void f(const char* a) { printf("%s", a); }
  template <typename A>
  void f(vector<A>& x) {
    for (auto& y : x) {
      f(y);
      f(" ");
    }
  }
  void print() {}
  template <typename Head, typename... Tail>
  void print(Head H, Tail... T) {
    f(H);
    print(T...);
  }
};
struct DEBUG {
  string open = "[", close = "]", sep = ", ";
  string f(string s) { return s; }
  string f(char c) { return string(1, c); }
  string f(int x) { return to_string(x); }
  string f(long long x) { return to_string(x); }
  string f(double x) { return to_string(x); }
  string f(const char* a) { return a; }
  template <typename A, typename B>
  string f(pair<A, B> p) {
    return open + f(p.first) + sep + f(p.second) + close;
  }
  template <typename A>
  string f(A v) {
    string s = open;
    for (auto a : v) {
      if (s != open) {
        s += sep;
      }
      s += f(a);
    }
    s += close;
    return s;
  }
  void show() { cout << endl; }
  template <typename Head, typename... Tail>
  void show(Head H, Tail... T) {
    cout << " " << f(H);
    show(T...);
  }
};
vector<long long> di = {0, 0, 1, -1, 1, -1, 1, -1};
vector<long long> dj = {1, -1, 0, 0, -1, -1, 1, 1};
long long ob(long long i, long long n) { return i < 0 || i >= n; }
long long tp(long long x) { return (1LL << x); }
long long roundup(long long a, long long b) {
  return a % b ? a / b + 1 : a / b;
}
template <typename A, typename B>
long long exist(A a, B b) {
  return a.find(b) != a.end();
}
vector<string> ssplit(string s) {
  vector<string> ans;
  stringstream ss;
  ss << s;
  while (ss >> s) ans.push_back(s);
  return ans;
}
void makemod(long long& x, long long m) {
  x %= m;
  x += m;
  x %= m;
}
long long powmod(long long a, long long b, long long m) {
  if (b == 0) return 1;
  long long h = powmod(a, b / 2, m);
  long long ans = h * h % m;
  return b % 2 ? ans * a % m : ans;
}
bool isvowel(char ch) {
  return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u');
}
long long sign(long long x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
void upmin(long long& x, long long v) { x = min(x, v); }
void upmax(long long& x, long long v) { x = max(x, v); }
const vector<long long> mods = {(long long)1e9 + 7, 998244353,
                                (long long)1e6 + 3, (long long)1e18 + 5};
const long long mod = mods[0];
const long long inf = mods[3];
const double eps = 1e-10;
const double pi = acos(0) * 2;
const string nl = "\n";
long long ok = 1;
void dfs(long long at, long long cur, vector<long long>& col,
         vector<vector<long long> >& adj) {
  col[at] = cur;
  for (auto to : adj[at]) {
    if (col[to] == cur) {
      ok = 0;
      return;
    } else if (col[to] == -1) {
      dfs(to, !cur, col, adj);
    }
  }
}
void solve() {
  long long n, m;
  do {
    FASTINPUT inp;
    inp.read(n, m);
  } while (false);
  vector<vector<long long> > E(m, vector<long long>(2));
  do {
    FASTINPUT inp;
    inp.read(E);
  } while (false);
  vector<vector<long long> > adj(m);
  for (long long i = 0; i < m; i++) {
    for (long long j = i + 1; j < m; j++) {
      set<long long> S;
      for (long long x = 0; x < 2; x++) {
        S.insert(E[i][x]);
        S.insert(E[j][x]);
      }
      if (S.size() != 4) continue;
      long long lo = E[i][0], hi = E[i][1];
      if (lo > hi) swap(lo, hi);
      long long cnt = 0;
      for (long long x = 0; x < 2; x++) {
        cnt += (E[j][x] >= lo && E[j][x] <= hi);
      }
      if (cnt == 1) {
        adj[i].push_back(j);
        adj[j].push_back(i);
      }
    }
  }
  vector<long long> col(m, -1);
  for (long long i = 0; i < m; i++) {
    if (col[i] == -1) dfs(i, 0, col, adj);
  }
  if (!ok) {
    do {
      FASTOUTPUT out;
      out.print("Impossible", nl);
    } while (false);
  } else {
    for (long long i = 0; i < m; i++) {
      if (col[i] == 0) do {
          FASTOUTPUT out;
          out.print('i');
        } while (false);
      else
        do {
          FASTOUTPUT out;
          out.print('o');
        } while (false);
    }
    do {
      FASTOUTPUT out;
      out.print(nl);
    } while (false);
  }
}
signed main() {
  long long t = 1;
  for (long long i = 0; i < t; i++) solve();
  return 0;
}

```