#include <bits/stdc++.h>
using namespace ::std;
const long double PI = acos(-1);
const long long MOD = 1000000000 + 7;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long add(long long a, long long b, long long m = MOD) {
  if (a >= m) a %= m;
  if (b >= m) b %= m;
  if (a < 0) a += m;
  if (b < 0) b += m;
  long long res = a + b;
  if (res >= m or res <= -m) res %= m;
  if (res < 0) res += m;
  return res;
}
long long mul(long long a, long long b, long long m = MOD) {
  if (a >= m) a %= m;
  if (b >= m) b %= m;
  if (a < 0) a += m;
  if (b < 0) b += m;
  long long res = a * b;
  if (res >= m or res <= -m) res %= m;
  if (res < 0) res += m;
  return res;
}
long long pow_mod(long long a, long long b, long long m = MOD) {
  long long res = 1LL;
  a = a % m;
  while (b) {
    if (b & 1) res = mul(res, a, m);
    b >>= 1;
    a = mul(a, a, m);
  }
  return res;
}
long long fastexp(long long a, long long b) {
  long long res = 1LL;
  while (b) {
    if (b & 1) res = res * a;
    b >>= 1;
    a *= a;
  }
  return res;
}
int gcdExtendido(int a, int b, int *x, int *y) {
  if (a == 0) {
    *x = 0;
    *y = 1;
    return b;
  }
  int x1, y1;
  int gcd = gcdExtendido(b % a, a, &x1, &y1);
  *x = y1 - (b / a) * x1;
  *y = x1;
  return gcd;
}
int modInverso(int a, int m) {
  int x, y;
  int g = gcdExtendido(a, m, &x, &y);
  if (g != 1)
    return -1;
  else
    return (x % m + m) % m;
}
const int M = 300000 + 5;
int N, n, m;
vector<int> G[M];
map<pair<int, int>, int> E;
void clearAll() {
  for (int i = 1; i <= n; i++) {
    G[i].clear();
  }
}
int main() {
  int t;
  scanf("%d", &(t));
  int a, b;
  while (t--) {
    scanf("%d %d", &(N), &(m));
    n = N + N + N;
    bool forest = true;
    E.clear();
    vector<bool> used(n + 1, false);
    vector<int> matching;
    for (int i = 1; i <= m; i++) {
      scanf("%d %d", &(a), &(b));
      if (a > b) swap(a, b);
      G[a].emplace_back(b);
      G[b].emplace_back(a);
      E[make_pair(a, b)] = i;
    }
    for (int u = 1; u <= n; u++) {
      if (used[u]) continue;
      for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (!used[v]) {
          matching.emplace_back(E[make_pair(min(u, v), max(u, v))]);
          used[u] = used[v] = true;
          break;
        }
      }
    }
    if (matching.size() >= N) {
      puts("Matching");
      for (int i = 0; i < N; i++) {
        printf("%d%c", matching[i], (i + 1 == N ? '\n' : ' '));
      }
    } else {
      puts("IndSet");
      int cnt = N;
      for (int i = 1; i <= n; i++) {
        if (cnt == 0) break;
        if (!used[i]) {
          cnt -= 1;
          printf("%d%c", i, (cnt ? ' ' : '\n'));
        }
      }
    }
    if (t) clearAll();
  }
  return 0;
}
