#include <bits/stdc++.h>
using namespace std;
const int N = 210;
struct Edge {
  int from, to, next;
  bool flag;
} e[N * N];
int head[N], tot, degree[N], ed;
vector<int> tmp;
vector<pair<int, int> > ans;
void init() {
  memset(head, -1, sizeof(head));
  tot = 0;
}
void addedge(int from, int to) {
  e[tot] = (Edge){from, to, head[from], false};
  head[from] = tot++;
}
void dfs(int u) {
  for (int &i = head[u]; i != -1; i = e[i].next) {
    if (!e[i].flag) {
      e[i].flag = true;
      e[i ^ 1].flag = true;
      if (i <= ed) ans.push_back(make_pair(e[i].from, e[i].to));
      dfs(e[i].to);
    }
  }
}
int main() {
  int _, n, m;
  scanf("%d", &_);
  while (_--) {
    scanf("%d%d", &n, &m);
    int u, v;
    memset(degree, 0, sizeof(degree));
    ans.clear();
    tmp.clear();
    init();
    for (int i = 1; i <= m; i++) {
      scanf("%d%d", &u, &v);
      addedge(u, v);
      addedge(v, u);
      degree[u]++, degree[v]++;
    }
    int Ans = n;
    for (int i = 1; i <= n; i++)
      if (degree[i] & 1) tmp.push_back(i), Ans--;
    ed = tot - 1;
    for (int i = 0; i < tmp.size(); i += 2)
      addedge(tmp[i], tmp[i + 1]), addedge(tmp[i + 1], tmp[i]);
    for (int i = 0; i < tot; i++)
      if (!e[i].flag) dfs(e[i].to);
    printf("%d\n", Ans);
    for (int i = 0; i < m; i++) printf("%d %d\n", ans[i].first, ans[i].second);
  }
  return 0;
}
