#include <bits/stdc++.h>
using namespace std;
int to[210 * 210], head[210], nxt[210 * 210], E;
int vst[210];
int L[210 * 210], R[210 * 210];
int prv[210], a[210], tp[210][210], cnt, deg[210];
pair<int, int> ans[210 * 210];
int indeg[210], outdeg[210];
int q[210 * 210], qf, qb;
void add_edge(int u, int v) {
  to[E] = v;
  nxt[E] = head[u];
  head[u] = E++;
  to[E] = u;
  nxt[E] = head[v];
  head[v] = E++;
  deg[u]++;
  deg[v]++;
  return;
}
int dfs(int u) {
  int v, ct;
  for (int ID = head[u]; ID != -1; ID = nxt[ID]) {
    v = to[ID];
    if (v == prv[u]) continue;
    if (prv[v] == -1) {
      prv[v] = u;
      if (dfs(v)) return 1;
    } else {
      ct = 0;
      while (1) {
        a[ct++] = u;
        if (u == v) break;
        u = prv[u];
      }
      reverse(a, a + ct);
      a[ct++] = v;
      for (int i = 0; i < ct - 1; i++) {
        ans[cnt++] = pair<int, int>(a[i] + 1, a[i + 1] + 1);
        tp[a[i]][a[i + 1]] = tp[a[i + 1]][a[i]] = 1;
      }
      return 1;
    }
  }
  return 0;
}
int main() {
  int T, N, M, ct, u, v;
  for (scanf("%d", &T); T--;) {
    cnt = 0;
    memset(tp, 0, sizeof(tp));
    scanf("%d%d", &N, &M);
    for (int i = 0; i < M; i++) {
      scanf("%d%d", L + i, R + i);
      L[i]--;
      R[i]--;
    }
    ct = 0;
    while (1) {
      memset(head, 0xff, sizeof(head));
      memset(prv, 0xff, sizeof(prv));
      E = 0;
      for (int i = 0; i < M; i++) {
        if (tp[L[i]][R[i]]) continue;
        add_edge(L[i], R[i]);
      }
      bool ok = false;
      for (int i = 0; i < N; i++) {
        if (prv[i] != -1) continue;
        prv[i] = -2;
        if (dfs(i)) {
          ok = true;
          break;
        }
      }
      if (!ok) break;
    }
    while (1) {
      memset(head, 0xff, sizeof(head));
      memset(deg, 0, sizeof(deg));
      memset(vst, 0, sizeof(vst));
      E = 0;
      for (int i = 0; i < M; i++) {
        if (tp[L[i]][R[i]]) continue;
        add_edge(L[i], R[i]);
      }
      bool ok = false;
      for (int i = 0; i < N; i++) {
        if (deg[i] != 1) continue;
        ok = true;
        qf = qb = 0;
        q[qb++] = i;
        vst[i] = 1;
        while (qf < qb) {
          u = q[qf++];
          for (int ID = head[u]; ID != -1; ID = nxt[ID]) {
            v = to[ID];
            if (vst[v]) continue;
            vst[v] = 1;
            q[qb++] = v;
            break;
          }
        }
        for (int i = 0; i < qb - 1; i++) {
          ans[cnt++] = pair<int, int>(q[i] + 1, q[i + 1] + 1);
          tp[q[i]][q[i + 1]] = tp[q[i + 1]][q[i]] = 1;
        }
        break;
      }
      if (!ok) break;
    }
    memset(indeg, 0, sizeof(indeg));
    memset(outdeg, 0, sizeof(outdeg));
    for (int i = 0; i < cnt; i++) {
      indeg[ans[i].first - 1]++;
      outdeg[ans[i].second - 1]++;
    }
    int res = 0;
    for (int i = 0; i < N; i++)
      if (indeg[i] == outdeg[i]) res++;
    printf("%d\n", res);
    for (int i = 0; i < cnt; i++)
      printf("%d %d\n", ans[i].first, ans[i].second);
  }
  return 0;
}
