One day n students come to the stadium. They want to play football, and for that they need to split into teams, the teams must have an equal number of people.

We know that this group of people has archenemies. Each student has at most two archenemies. Besides, if student A is an archenemy to student B, then student B is an archenemy to student A.

The students want to split so as no two archenemies were in one team. If splitting in the required manner is impossible, some students will have to sit on the bench.

Determine the minimum number of students you will have to send to the bench in order to form the two teams in the described manner and begin the game at last.

Input

The first line contains two integers n and m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100) — the number of students and the number of pairs of archenemies correspondingly.

Next m lines describe enmity between students. Each enmity is described as two numbers ai and bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — the indexes of the students who are enemies to each other. Each enmity occurs in the list exactly once. It is guaranteed that each student has no more than two archenemies.

You can consider the students indexed in some manner with distinct integers from 1 to n.

Output

Print a single integer — the minimum number of students you will have to send to the bench in order to start the game.

Examples

Input

5 4
1 2
2 4
5 3
1 4


Output

1

Input

6 2
1 4
3 4


Output

0

Input

6 6
1 2
2 3
3 1
4 5
5 6
6 4


Output

2
/**
 * <p>
 * Unsolved
 * </p>
 * <p>
 * Created on Aug 14, 2012, 11:09:31 AM
 * </p>
 * @Author Andy Y.F. Huang
 */
public class p216B {
  private void solve(int test_number) {
    int students = in.nextInt();
    int edges = in.nextInt();
    int indy = 0;
    int ans = 0;
    int cnt[] = new int[students];
    int deg[] = new int[students];
    int edgecnt[] = new int[students];
    DisjointSet dsu = new DisjointSet(students);
    for (int i = 0; i < edges; i++) {
      int a = in.nextInt() - 1;
      int b = in.nextInt() - 1;
      dsu.union(dsu.find(a), dsu.find(b));
      deg[a]++;
      deg[b]++;
    }
    for (int i = 0; i < students; i++) {
      int root = dsu.find(i);
      cnt[root]++;
      edgecnt[root] += deg[i];
    }
    for (int i = 0; i < students; i++) {
      ans += cnt[i] / 2;
      if (cnt[i] % 2 == 1 && (edgecnt[i] / 2) % 2 == 0)
        indy += cnt[i] % 2;
    }
    ans += indy / 2;
    out.appendln(students - 2 * ans);
  }

  private Input in;
  private Output out;

  void solve() {
    in = new Input("");
    out = new Output("");
    solve(1);
    out.close();
  }

  public static void main(String[] args) {
    p216B solver = new p216B();
    solver.solve();
  }

  static void pln(Object... obj) {
    pf(obj);
    System.out.println();
  }

  static void pf(Object... obj) {
    for (int i = 0; i < obj.length; i++) {
      if (i != 0)
        System.out.print(' ');
      System.out.print(obj[i]);
    }
  }
}

class DisjointSet {
  private final int tree[];

  public DisjointSet(int size) {
    tree = new int[size + 1];
    java.util.Arrays.fill(tree, -1);
  }

  public void union(int root1, int root2) {
    if (root1 == root2 || tree[root1] >= 0 || tree[root2] >= 0)
      return;
    if (tree[root2] < tree[root1])
      tree[root1] = root2;
    else {
      if (tree[root1] == tree[root2])
        tree[root1]--;
      tree[root2] = root1;
    }
  }

  public int find(int x) {
    return tree[x] < 0 ? x : (tree[x] = find(tree[x]));
  }

}

class Input {
  private java.io.BufferedReader reader;
  private java.util.StringTokenizer tokenizer;

  Input(String filename) {
    if (!filename.isEmpty()) {
      try {
        reader = new java.io.BufferedReader(new java.io.FileReader(filename));
      }
      catch (java.io.FileNotFoundException e) {
        throw new RuntimeException(e);
      }
    }
    else
      reader = new java.io.BufferedReader(new java.io.InputStreamReader(
          System.in));
    tokenizer = new java.util.StringTokenizer("");
  }

  String next() {
    while (!tokenizer.hasMoreTokens()) {
      try {
        tokenizer = new java.util.StringTokenizer(reader.readLine());
      }
      catch (java.io.IOException e) {
        throw new RuntimeException(e);
      }
    }
    return tokenizer.nextToken();
  }

  String nextLine() {
    try {
      return reader.readLine();
    }
    catch (java.io.IOException e) {
      throw new RuntimeException(e);
    }
  }

  long nextLong() {
    return Long.parseLong(next());
  }

  int nextInt() {
    return Integer.parseInt(next());
  }

  double nextDouble() {
    return Double.parseDouble(next());
  }

}

class Output {
  private java.io.PrintWriter buffer;

  Output(String filename) {
    if (!filename.isEmpty())
      try {
        buffer = new java.io.PrintWriter(filename);
      }
      catch (java.io.FileNotFoundException e) {
        throw new RuntimeException();
      }
    else
      buffer = new java.io.PrintWriter(System.out);
  }

  void flush() {
    buffer.flush();
  }

  void close() {
    buffer.close();
  }

  void append(Object... obj) {
    for (int i = 0; i < obj.length; i++) {
      if (i != 0)
        buffer.write(' ');
      buffer.print(obj[i]);
    }
  }

  void appendln(Object... obj) {
    append(obj);
    buffer.write('\n');
  }
}
