#include <bits/stdc++.h>
using namespace std;
const int N = 202;
const int M = N * N;
int d[N];
bool used[M * 2];
vector<int> vet[N], ansE[N];
struct Edge {
  int to, next;
} e[M * 2];
int H[N], tot, old;
void addedge(int u, int v) {
  e[tot].to = v;
  e[tot].next = H[u];
  H[u] = tot++;
}
int fa[N];
int Find(int x) { return fa[x] = (fa[x] == x ? x : Find(fa[x])); }
void Merge(int x, int y) {
  int fx = Find(x);
  int fy = Find(y);
  fa[fx] = fy;
}
void dfs(int u) {
  for (int i = H[u]; ~i; i = H[u]) {
    H[u] = e[i].next;
    if (!used[i]) {
      used[i] = used[i ^ 1] = 1;
      dfs(e[i].to);
      if (i < old) ansE[u].push_back(e[i].to);
    }
  }
}
void init() {
  tot = 0;
  memset(d, 0, sizeof d);
  memset(H, -1, sizeof H);
  memset(used, 0, sizeof used);
  for (int i = 1; i < N; i++) {
    fa[i] = i;
    vet[i].clear();
    ansE[i].clear();
  }
}
int main() {
  int T, n, m, u, v;
  scanf("%d", &T);
  for (int Case = 1; Case <= T; Case++) {
    init();
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
      scanf("%d%d", &u, &v);
      addedge(u, v);
      addedge(v, u);
      d[u]++;
      d[v]++;
      Merge(u, v);
    }
    old = tot;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
      if (d[i] % 2 == 0)
        ++ans;
      else
        vet[Find(i)].push_back(i);
    }
    for (int i = 1; i <= n; i++) {
      int len = vet[i].size();
      for (int j = 0; j < len; j += 2) {
        addedge(vet[i][j], vet[i][j + 1]);
        addedge(vet[i][j + 1], vet[i][j]);
      }
    }
    for (int i = 1; i <= n; i++) {
      if (fa[i] == i) dfs(i);
    }
    printf("%d\n", ans);
    for (int i = 1; i <= n; i++) {
      for (int &j : ansE[i]) {
        printf("%d %d\n", i, j);
      }
    }
  }
  return 0;
}
